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
答案 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
]