这里,foo
和 bar
是方法。那么块传递给哪个方法?事实证明,do..end
块将被传递给最左边的方法 ,而花括号中的块将被发送到最右边的方法 bar
。这是因为花括号具有更高的优先级。思考这个程序…
precedence.rb
另一方面,花括号块具有更高的优先级,因此它尝试立即执行并传递给第一个可能的接收方法 (bar)
。然后将结果(即 bar
返回的值)作为参数传递给 foo
;但这一次, 本身并没有收到块。因此,以下两个表达式是等效的:
提示…
一个方法可以使用block_given?
方法测试它是否已经收到一个块。你可以在 precedence.rb 程序中找到相关示例。