可能重复:
What’s this &block in Ruby? And how does it get passes in a method here?
我不了解&block
部分,它做了什么?
这是一个例子:
def method_missing(method_name, *args, &block)
@messages << method_name
@object.send method_name, *args, &block
end
答案 0 :(得分:5)
Blocks
让您有机会声明回调以传递给方法。
&
在这里是关键 - 就像@pst提到的那样,它将块“提升”到Proc并将Proc绑定到具有给定名称的变量。
使用 &
def time(&block)
puts block
end
time
# => nil
time { foo }
# => #<Proc:0x00029bbc>
没有 &
def time(block)
puts block
end
time { foo }
# => ArgumentError: wrong number of arguments (0 for 1)
# Because & isn't included, the method instead expected an arguement,
# but as a block isn't a arguement an error is returned.
答案 1 :(得分:4)
回答“我将如何将其传递给另一种方法?” Brian的评论:
像这样:
def compose init_value, n=2, &b
if n==0 then init_value else
b.call( compose init_value, n - 1, &b )
end
end
compose 2 do |n| n * n end
#=> 16
compose 2, 4 do |n| n * n end
#=> 65536
compose 2, 4 do |n| n * 0.5 end
#=> 0.125
这是一种递归方法,以递归方式将相同的块多次应用于数字。这里,打包到b
参数的块被调用,但同时它被递归地传递给compose
方法,而n
参数递减1.同样, b
可以传递给任何方法,例如map
,reduce
,任何内容。
然而,如果你不需要将块传递给另一种方法,你可以简单地使用yield
:
def apply_block_to_1_2_3
return yield( 1 ), yield( 2 ), yield( 3 )
end
apply_block_to_1_2_3 { |n| n * n }
#=> [1, 4, 9]
愿力量与你同在。
答案 2 :(得分:3)
它将块转换为可以传递给另一个方法的proc对象。
答案 3 :(得分:1)
当您使用块调用方法时,有两种方法可以使用该块:
yield
Proc
添加到其中来将其转换为&
对象用第二种方法可以将它传递给另一种方法。
因此,在您的情况下,它会将给定的块转换为Proc
并使用它来调用method_name
。
想到它,因为你可以像任何一个论点一样传递一个块。