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