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

pad*_*dyB 1 ruby proc

clock 采取一个块:

def clock(&block)
  hours = Time.new.hour
  puts hours
  hours.times do
    block.call
  end
end
Run Code Online (Sandbox Code Playgroud)

这可以工作,并"DONG"根据今天的小时数放在屏幕上:

clock do
  puts "DONG..."
end
Run Code Online (Sandbox Code Playgroud)

我正在尝试传递dong方法:

def dong
  puts "DONG..."
end
Run Code Online (Sandbox Code Playgroud)

clock作为其块.这个:

clock(dong)
Run Code Online (Sandbox Code Playgroud)

抛出错误:

`clock': wrong number of arguments (1 for 0) (ArgumentError)
Run Code Online (Sandbox Code Playgroud)

有人可以解释为什么第一个有效,但第二个没有?您是否必须明确定义要传递的代码块,还是可以将另一个方法作为代码块引用?

ndn*_*kov 7

因为

clock(dong)
Run Code Online (Sandbox Code Playgroud)

不会调用clockdong方法块,它调用的结果调用它dong的方法.因此,您会得到参数错误,因为您尝试clock使用一个参数调用method(),而它期望没有(除了可选块,不计数).

dong在调用中将该方法用作块,您可以执行以下操作:

clock(&method(:dong))
Run Code Online (Sandbox Code Playgroud)

method(:dong)将为您提供一个Method表示该dong方法的对象(而不是调用它),同时&将其转换为proc(然后再转换为块).