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

时间:2011-07-16 09:52:32

标签: ruby

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

2 个答案:

答案 0 :(得分:3)

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

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

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

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

当然,&符号反过来 - 如果一个方法需要一个块并且你有一个proc对象,你可以简单地用&作为前缀,就像你写的那样。更准确地说,&调用传递对象的to_proc方法(Rails以类似于described in this entry about to_proc的方式使用它。

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

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

答案 1 :(得分:0)

你可以扩展类整数:

class Integer
  def double
    self*2
  end
end

[1,2,3,4].map(&:double)
[
    [0] 2,
    [1] 4,
    [2] 6,
    [3] 8
]
相关问题