There's no difference, in fact map
is implemented in C as rb_ary_collect
and enum_collect
(eg. there is a difference between map
on an array and on any other enum, but no difference between map
and collect
).
Why do both map
and collect
exist in Ruby? The map
function has many naming conventions in different languages. Wikipedia provides an overview:
The map function originated in functional programming languages but is today supported (or may be defined) in many procedural, object oriented, and multi-paradigm languages as well: In C++'s Standard Template Library, it is called transform
, in C# (3.0)'s LINQ library, it is provided as an extension method called Select
. Map is also a frequently used operation in high level languages such as Perl, Python and Ruby; the operation is called map
in all three of these languages. A collect
alias for map is also provided in Ruby (from Smalltalk) [emphasis mine]. Common Lisp provides a family of map-like functions; the one corresponding to the behavior described here is called mapcar
(-car indicating access using the CAR operation).
Ruby provides an alias for programmers from the Smalltalk world to feel more at home.
Why is there a different implementation for arrays and enums? An enum is a generalized iteration structure, which means that there is no way in which Ruby can predict what the next element can be (you can define infinite enums, see Prime for an example). Therefore it must call a function to get each successive element (typically this will be the each
method).
Arrays are the most common collection so it is reasonable to optimize their performance. Since Ruby knows a lot about how arrays work it doesn't have to call each
but can only use simple pointer manipulation which is significantly faster.
Similar optimizations exist for a number of Array methods like zip
or count
.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…