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