array# map如何有参数来做这样的事情

  • 本文关键字:map 参数 array# 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只能有block,不能有normal参数

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的这一项。

我希望这能回答你的一些疑问。如果我写的有错误,请指正。

你可能会发现有用的阅读:

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

你可以扩展integer类:

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

最新更新