0

很抱歉不知道如何更好地陈述这个问题。

我注意到 {} 的块语法如何绑定到紧靠左侧的对象,然后注意到 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' 中没有 (*) 参数会发生什么,那么它会显示“参数数量错误 1 ​​对 0”,但我传递的参数是什么?为什么它只给'a'?

4

1 回答 1

2
a b {}       # a(b{})
a b do end   # (a(b)) do end

a(b do end)  # behaves like a b {}  

解析器将 { 紧密绑定到它之前的标记。如果省略方法参数周围的括号,花括号块将与最后一个参数相关联 - 可能不需要。

于 2015-04-02T21:52:44.630 回答