为什么将方法作为参数 (&block) 传递不起作用?

Why does passing a method as an argument (&block) not work?

clock 占一格:

def clock(&block)
  hours = Time.new.hour
  puts hours
  hours.times do
    block.call
  end
end

这有效,并根据今天的时间将 "DONG" 显示在屏幕上:

clock do
  puts "DONG..."
end

我正在尝试通过 dong 方法:

def dong
  puts "DONG..."
end

clock作为它的块。这个:

clock(dong)

抛出错误:

`clock': wrong number of arguments (1 for 0) (ArgumentError)

谁能解释为什么第一个有效,而第二个无效?您是否必须显式定义要传递的代码块,或者您可以引用另一个方法作为代码块吗?

因为

clock(dong)

不使用 dong 方法作为块调用 clock,而是使用调用 dong 方法的结果来调用它。因此,你得到参数错误,因为你试图用一个参数调用一个方法(clock),而它期望 none(除了一个可选块,它不算)。

要在调用中使用 dong 方法作为块,您可以这样做:

clock(&method(:dong))

method(:dong) 会给你一个 Method 对象代表 dong 方法(而不是调用它),而 & 会把它转换成 proc(然后块)。

要传递 ,您必须在大括号内编写块代码(或 doend

clock() { dong }

或更简单地说

clock { dong }