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

标签 ruby proc

clock 占用一个 block :

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

时钟作为它的 block 。这:

clock(dong)

抛出一个错误:

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

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

最佳答案

因为

clock(dong)

不以dong方法作为一个 block 来调用clock,而是以调用dong方法的结果来调用它。因此,您会收到参数错误,因为您尝试使用一个参数调用一个方法 (clock),而它期望没有参数(除了一个可选 block ,该 block 不算在内)。

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

clock(&method(:dong))

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

关于ruby - 为什么将方法作为参数 (&block) 传递不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35258833/

相关文章:

ruby-on-rails - ActionController::RoutingError(没有路由匹配 [GET] "/serviceworker.js"):

ruby - 您可以在 irb session 中自动在每个命令上执行 'require' ruby​​ 文件吗?

android - 无法理解linux命令的输出

linux -/proc文件系统中文件的时间戳是否表示参数采样的时间?

linux -/proc/pid/fdinfo/fd_num 中的标志 02000002 是什么意思?

android - 使用 Rails Devise 的移动应用程序 webframe 身份验证

ruby - 使 headless 浏览器停止加载页面

compare - SAS proc 比较中的 BY 语句

ruby - 为什么我不能将 block 传递给 Ruby 中的 proc?

ruby - 使用 MIddleman 3.0 - 如何在动态页面上设置单独的页面标题?