Немає різниці, насправді 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).collectmapcar
Ruby надає псевдонім для програмістів зі світу Smalltalk, щоб відчути себе більше як вдома.
Чому існує різна реалізація для масивів та перерахунків? Перерахунок - це узагальнена структура ітерації, що означає, що немає способу, щоб Рубі міг передбачити, яким може бути наступний елемент (можна визначити нескінченні перерахунки, див. Приклад Prime ). Тому необхідно викликати функцію для отримання кожного наступного елемента (зазвичай це буде eachметод).
Масиви - це найпоширеніша колекція, тому розумно оптимізувати їх продуктивність. Оскільки Рубі багато знає про те, як працюють масиви, їй не потрібно дзвонити, eachа може використовувати лише просту маніпуляцію з покажчиком, що значно швидше.
Подібні оптимізації існують для ряду методів Array, таких як zipабо count.
mapє кращим у Code Golf .