Я гуглил это и получил неоднозначные / противоречивые мнения - есть ли на самом деле какая-то разница между выполнением map
и выполнением в collect
массиве в Ruby / Rails?
В документах , кажется, не предполагают какие - либо, но есть , возможно , различие в методе или производительности?
map
является предпочтительным в Code Golf .map
предпочтение отдается CodeGolf, что может быть неочевидно для всех: это только потому, чтоcollect
он на четыре символа длиннееmap
, но по функциональности одинаков.collect
более читабельным и естественным - идея «собирать» записи и делать X для них имеет для меня более естественный смысл, чем «отображать» записи и делать X для них.Ответы:
Там нет никакой разницы, на самом деле
map
реализовано в C какrb_ary_collect
иenum_collect
(например, есть разница междуmap
массивом и любым другим перечислением, но нет разницы междуmap
иcollect
).Почему оба
map
иcollect
существуют в Ruby?map
Функция имеет много соглашений об именах на разных языках. Википедия предоставляет обзор :Ruby предоставляет псевдоним программистам из мира Smalltalk, чтобы они чувствовали себя как дома.
Почему существует другая реализация для массивов и перечислений? Перечисление - это обобщенная итерационная структура, которая означает, что Ruby не может предсказать, каким может быть следующий элемент (вы можете определить бесконечные перечисления, см. Пример Prime ). Поэтому он должен вызывать функцию для получения каждого последующего элемента (обычно это будет
each
метод).Массивы являются наиболее распространенной коллекцией, поэтому целесообразно оптимизировать их производительность. Поскольку Ruby знает много о том, как работают массивы, ему не нужно вызывать,
each
а можно использовать только простое манипулирование указателем, что значительно быстрее.Подобные оптимизации существуют для ряда методов Array, таких как
zip
orcount
.источник
count
,length
илиsize
. Различные слова для того же атрибут массива, но при этом, Ruby позволяет выбрать наиболее подходящее слово для вашего кода: вы хотите , количество пунктов , которые Вы собираете, то длина массива, или текущего размера от структура. По сути, они все одинаковые, но выбор правильного слова может облегчить чтение вашего кода, что является хорошим свойством языка.Мне сказали, чтоони одинаковы.На самом деле они задокументированы в том же месте под ruby-doc.org:
http://www.ruby-doc.org/core/classes/Array.html#M000249
источник
Я выполнил тест теста, чтобы попытаться ответить на этот вопрос, затем нашел этот пост, так что вот мои выводы (которые немного отличаются от других ответов)
Вот эталонный код:
И результаты, которые я получил, были:
Возможно, псевдоним не бесплатный?
источник
collect
Иcollect!
методы псевдонимыmap
иmap!
, таким образом , они могут быть использованы как взаимозаменяемые. Вот простой способ подтвердить это:источник
Ruby псевдоним метода Array # map для Array # collect; они могут использоваться взаимозаменяемо. (Руби Монах)
Другими словами, тот же исходный код:
http://ruby-doc.org/core-2.2.0/Array.html#method-i-map
источник