【问题标题】:Why does passing a method as an argument (&block) not work?为什么将方法作为参数(&block)传递不起作用?
【发布时间】:2016-02-07 20:38:54
【问题描述】:

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)

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

【问题讨论】:

    标签: ruby proc


    【解决方案1】:

    因为

    clock(dong)
    

    不以dong 方法作为块调用clock,而是以调用dong 方法的结果调用它。因此,您会收到参数错误,因为您尝试使用一个参数调用方法 (clock),而它没有预期的参数(除了一个不计入的可选块)。

    要将dong 方法用作调用中的块,您可以这样做:

    clock(&method(:dong))
    

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

    【讨论】:

    • 啊,有道理。 dong = puts-ing "DONG" 的结果,这是时钟的一个参数。时钟应该有零个参数,只是一个可选的代码块。 (只是为了我自己的启迪而重申你的答案)。谢谢,@ndn!我喜欢下面的@sagarpandya82 语法。
    • from_irb> [5, 7, 8, 1].each(&method(:puts)) 5 7 8 1
    【解决方案2】:

    要传递一个,你必须在花括号(或doend)内编写块代码

    clock() { dong }
    

    或者更简单

    clock { dong }
    

    【讨论】:

      猜你喜欢
      • 2022-10-12
      • 1970-01-01
      • 2015-09-09
      • 1970-01-01
      • 2010-11-16
      • 1970-01-01
      • 2010-11-04
      • 2012-03-27
      相关资源
      最近更新 更多