为什么我们不能将带有其他参数的{}块传递给Ruby中的方法

时间:2016-06-16 20:05:44

标签: ruby

当使用其他参数将块传递给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"})

显然后者在语法上是错误的

2 个答案:

答案 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"})