很抱歉不知道如何更好地陈述这个问题。
我注意到{}的块语法如何立即绑定到左边的对象,然后注意到do/end绑定到开始行的对象。在这个过程中,我注意到:
def a(*)
puts "a: #{block_given?}"
end
def b
puts "b: #{block_given?}"
end
a b {}
#=> b: true
#=> a: false
a b do end
#=> b: false
#=> a: true
令人困惑的是,我不需要方法'b'上的(*)运算符(或任何参数),并且两个方法调用行都会导致相同的错误。
我只是不确定发生了什么,如果我在方法"a"中没有(*)参数,那么它会说"0的参数数1错误",但我传递的参数是什么?为什么只给"a"?
a b {} # a(b{})
a b do end # (a(b)) do end
a(b do end) # behaves like a b {}
语法分析器{紧密地绑定到它前面的标记。如果省略方法参数周围的括号,则大括号块将与最后一个参数关联,这可能是不需要的。