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

时间:2016-02-07 20:38:55

标签: ruby proc

circ_sum_of_diff([X|Xs], Sum) :- % must have at least one element I guess? circ_sum_of_diff_1(Xs, X, X, 0, Sum). circ_sum_of_diff_1([], Last, First, SoFar, Sum) :- Sum is SoFar + Last - First. circ_sum_of_diff_1([X|Xs], X0, First, SoFar0, Sum) :- SoFar is SoFar0 + X0 - X, circ_sum_of_diff_1(Xs, X, First, SoFar, Sum). 需要一个块:

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)

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

2 个答案:

答案 0 :(得分:7)

由于

clock(dong)

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

要在调用中使用dong方法作为块,您可以执行以下操作:

clock(&method(:dong))

method(:dong)将为您提供一个代表Method方法的dong对象(而不是调用它),而&会将其转换为proc(然后再阻止)

答案 1 :(得分:1)

要传递,您必须在花括号(或doend)中编写块代码

clock() { dong }

或更简单

clock { dong }