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