Немає різниці, насправді map
реалізовано в C як rb_ary_collect
і enum_collect
(наприклад, є різниця між map
масивом і будь-яким іншим перерахуванням, але різниці між map
і collect
).
Чому так map
і collect
існують в Ruby? map
Функція має багато угод про імена на різних мовах. Вікіпедія пропонує огляд :
Функція карти виникла у функціональних мовах програмування, але сьогодні підтримується (або може бути визначена) у багатьох процедурних, об'єктно-орієнтованих та мульти-парадигмах: також у стандартній бібліотеці шаблонів C ++ вона називається transform
в C # (3.0) Бібліотека LINQ, вона надається як метод розширення, який називається Select
. Карта також є часто використовуваною операцією на мовах високого рівня, таких як Perl, Python та Ruby; операція викликається map
на всіх трьох цих мовах. Ім'я користувача карти також надається в Ruby (від Smalltalk) [курсив мій]. Common Lisp забезпечує сімейство карт-функцій; той, що відповідає поведінці, описаній тут, називається (-кар, що вказує на доступ за допомогою операції CAR).collect
mapcar
Ruby надає псевдонім для програмістів зі світу Smalltalk, щоб відчути себе більше як вдома.
Чому існує різна реалізація для масивів та перерахунків? Перерахунок - це узагальнена структура ітерації, що означає, що немає способу, щоб Рубі міг передбачити, яким може бути наступний елемент (можна визначити нескінченні перерахунки, див. Приклад Prime ). Тому необхідно викликати функцію для отримання кожного наступного елемента (зазвичай це буде each
метод).
Масиви - це найпоширеніша колекція, тому розумно оптимізувати їх продуктивність. Оскільки Рубі багато знає про те, як працюють масиви, їй не потрібно дзвонити, each
а може використовувати лише просту маніпуляцію з покажчиком, що значно швидше.
Подібні оптимізації існують для ряду методів Array, таких як zip
або count
.
map
є кращим у Code Golf .