当使用其他参数将块传递给ruby中的方法时,为什么我们必须这样做
def method4(condition, attribute, &block)
return "No Block" if block.nil?
if condition
block.call
end
puts attribute
end
method4(true,4) do
puts "Hello World"
end
虽然我们不能那样做
method4(true,4,{puts "Hello World"})
显然后者在语法上是错误的
答案 0 :(得分:1)
您只能将其他对象作为参数传递,而块不是Ruby中的对象。块是句法结构。
但是它们很容易被包裹在Proc
类的对象中。甚至还有一个特殊的速记算子:
method4(true, 4, &->{puts 'Hello World'})
上述代码的简短说明:
->{}
围绕给定的块创建一个Proc
对象。由于method4
需要一个块而不是一个对象,因此您需要"展开"它再次阻止,这就是为什么&符号存在的原因。如果method4
的签名改为:
def method4(condition, attribute, proc) # note no ampersand
你也可以在方法调用中省略&符号。
答案 1 :(得分:0)
使用块调用方法的正确语法是method_name(arguments) { stuff() }
在method4(true,4,{puts "Hello World"})
中,花括号会给你一个语法错误,因为它可能是一个Hash对象,如:method4(true, 4, {puts: "Hello World"})