Array#map如何使用参数来做这样的事情?

def double(a) a*2 end method_object = method(:double) 

这是我的问题,这段代码怎么样:

 [1,3,5,6].map(&method_object) 

达到同样的效果

 [1,3,5,6].map {|x| method_object.call(x)} 

在Ruby文档中,Array#map只能有块,而不是普通参数

 ary.collect {|item| block } → new_ary ary.map {|item| block } → new_ary ary.collect → an_enumerator ary.map → an_enumerator 

简单地说,&符号用于将方法对象“打包/解包”到块中,因此效果与传递块的效果相同。

您可以通过以下方式“获取”已传递给您的方法的块:

 def method_with_block(&foo) # do something here foo.call # do something else end 

这类似于调用yield而不是声明&foo作为参数。 我认为这两种方法之间的约束可能不同,但在大多数情况下,效果就是你所期望的(如果我弄错了,请更正)。

当然,&符号反过来 – 如果一个方法需要一个块并且你有一个proc对象,你可以简单地用&前缀它,就像你写的那样。 更确切地说, &调用传递对象的to_proc方法(Rails以类似于本条目中描述的关于to_proc的方式使用它。

我希望这能解决你的一些疑虑。 如果我写的内容有误,请随时纠正。

你可能觉得有用的读物​​:

  • 编程Ruby ,必备书
  • Wikibooks包含有关此主题的部分
  • 这个简单的博客条目显示了一个例子

你可以扩展类整数:

 class Integer def double self*2 end end [1,2,3,4].map(&:double) [ [0] 2, [1] 4, [2] 6, [3] 8 ]