Ruby中的map和collect之间的区别?

我已经用Google搜索并得到了不完整/矛盾的观点 - 在Ruby / Rails中对数组执行
map
和执行
collect
之间是否存在任何差异? 这些文档似乎没有任何暗示,但是方法或性能可能存在差异吗?     
已邀请:
没有区别,实际上
map
在C中实现为
rb_ary_collect
enum_collect
(例如,数组和任何其他枚举上的
map
之间存在差异,但
map
collect
之间没有区别)。 为什么Ruby中存在
map
collect
map
函数在不同语言中有许多命名约定。维基百科提供了一个概述:   map函数起源于函数式编程语言,但现在支持(或可能定义)许多过程,面向对象和多范式语言:在C ++的标准模板库中,它被称为
transform
,在C#(3.0)中s LINQ库,它作为一个名为
Select
的扩展方法提供。 Map也是Perl,Python和Ruby等高级语言中经常使用的操作。在所有这三种语言中,该操作被称为
map
。 Ruby(来自Smalltalk)[强调我的]也提供了地图的
collect
别名。 Common Lisp提供了一系列类似地图的功能;与此处描述的行为相对应的一个称为
mapcar
(-car指示使用CAR操作的访问)。 Ruby为Smalltalk世界的程序员提供了一个别名,让他们有宾至如归的感觉。 为什么阵列和枚举有不同的实现?枚举是一种通用的迭代结构,这意味着Ruby无法预测下一个元素是什么(您可以定义无限枚举,请参阅Prime示例)。因此,它必须调用一个函数来获取每个连续的元素(通常这将是
each
方法)。 数组是最常见的集合,因此优化其性能是合理的。由于Ruby对数组如何工作有很多了解,因此不必调用
each
,但只能使用简单的指针操作,这种操作要快得多。 对于许多数组方法,例如
zip
count
,存在类似的优化。     
我被告知他们是一样的。 实际上,他们在ruby-doc.org下的同一个地方被记录: http://www.ruby-doc.org/core/classes/Array.html#M000249      ary.collect {| item |阻止}→new_ary   ary.map {| item |阻止}→new_ary   ary.collect→an_enumerator   ary.map→an_enumerator         为self的每个元素调用一次block。   创建一个包含块返回的值的新数组。   另见Enumerable#collect。   如果没有给出块,则返回枚举器。
a = [ "a", "b", "c", "d" ]
a.collect {|x| x + "!" }   #=> ["a!", "b!", "c!", "d!"]
a                          #=> ["a", "b", "c", "d"]
    
我做了一个基准测试试图回答这个问题,然后发现这篇文章,所以这里是我的发现(与其他答案略有不同) 这是基准代码:
require 'benchmark'

h = { abc: 'hello', 'another_key' => 123, 4567 => 'third' }
a = 1..10
many = 500_000

Benchmark.bm do |b|
  GC.start

  b.report("hash keys collect") do
    many.times do
      h.keys.collect(&:to_s)
    end
  end

  GC.start

  b.report("hash keys map") do
    many.times do
      h.keys.map(&:to_s)
    end
  end

  GC.start

  b.report("array collect") do
    many.times do
      a.collect(&:to_s)
    end
  end

  GC.start

  b.report("array map") do
    many.times do
      a.map(&:to_s)
    end
  end
end
我得到的结果是:
                   user     system      total        real
hash keys collect  0.540000   0.000000   0.540000 (  0.570994)
hash keys map      0.500000   0.010000   0.510000 (  0.517126)
array collect      1.670000   0.020000   1.690000 (  1.731233)
array map          1.680000   0.020000   1.700000 (  1.744398) 
也许别名不是免费的?     
Ruby将方法Array#map别名为Array#collect;它们可以互换使用。 (Ruby Monk) 换句话说,相同的源代码:
               static VALUE
rb_ary_collect(VALUE ary)
{
long i;
VALUE collect;

RETURN_SIZED_ENUMERATOR(ary, 0, 0, ary_enum_length);
collect = rb_ary_new2(RARRAY_LEN(ary));
for (i = 0; i < RARRAY_LEN(ary); i++) {
    rb_ary_push(collect, rb_yield(RARRAY_AREF(ary, i)));
}
return collect;
}
http://ruby-doc.org/core-2.2.0/Array.html#method-i-map     
collect
collect!
方法是
map
map!
的别名,因此它们可以互换使用。这是一个简单的方法来确认:
Array.instance_method(:map) == Array.instance_method(:collect)
 => true
    

要回复问题请先登录注册