为什么以下内容会返回错误?
[1, 2, 3, 4].each( { |num| puts num } )
为什么这不等于:
[1, 2, 3, 4].each { |num| puts num }
我在这里想到的是什么,一切都是方法'因此,如果没有模棱两可的方法,应该遵循相同的模式,并且可以省略parantheses?
答案 0 :(得分:7)
因为这在语法上无效。这不是支持将块传递给方法的语法。
Ruby的语法允许每个方法使用一个特殊的块参数,除了常规参数。参数的定义不同(通过{ |args| ... }
语法)和(可选)通过最终&variable
参数进行不同的接受:
def my_method(arg1, arg2, &block)
block.call("ok1")
# or, a special syntax for calling the &block:
yield "ok!"
end
my_method(value_for_arg_1, value_for_arg_2) do |arg|
# when invoked by my_method, arg will be "ok!"
end
您可以将块作为参数列表的一部分传递,但同样需要特定的语法:
my_block = Proc.new { puts "I'm a proc" }
my_method(value1, value2, &my_block)
只有当您打算将proc作为&my_block
参数传递时,才需要上述&block
;你可以在不使用&
的情况下传递任意数量的过程,但它们不能通过yield
调用。
答案 1 :(得分:1)
因为块不是对象。参数必须是对象。您不能用块替换参数,反之亦然。你不能将一个块括在括号内,并将其视为一个参数。
答案 2 :(得分:0)
因为如果你将块传递给方法(就像在这种情况下一样),你就把它放在parantheses之外,即使你将它们用于其他参数。