在Ruby中使用.each方法

时间:2014-04-03 14:08:32

标签: ruby

为什么以下内容会返回错误?

[1, 2, 3, 4].each( { |num| puts num } )

为什么这不等于:

[1, 2, 3, 4].each { |num| puts num }

我在这里想到的是什么,一切都是方法'因此,如果没有模棱两可的方法,应该遵循相同的模式,并且可以省略parantheses?

3 个答案:

答案 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参数传递时,才需要上述█你可以在不使用&的情况下传递任意数量的过程,但它们不能通过yield调用。

答案 1 :(得分:1)

因为块不是对象。参数必须是对象。您不能用块替换参数,反之亦然。你不能将一个块括在括号内,并将其视为一个参数。

答案 2 :(得分:0)

因为如果你将块传递给方法(就像在这种情况下一样),你就把它放在parantheses之外,即使你将它们用于其他参数。