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)
有人可以解释为什么第一个有效,但第二个没有?您是否必须明确定义要传递的代码块,还是可以将另一个方法作为代码块引用?
答案 0 :(得分:7)
由于
clock(dong)
不使用clock
方法作为块调用dong
,而是使用调用dong
方法的结果调用它。因此,你得到参数错误,因为你试图用一个参数调用一个方法(clock
),而它没有预期的(除了一个不计数的可选块)。
要在调用中使用dong
方法作为块,您可以执行以下操作:
clock(&method(:dong))
method(:dong)
将为您提供一个代表Method
方法的dong
对象(而不是调用它),而&
会将其转换为proc(然后再阻止)
答案 1 :(得分:1)
要传递块,您必须在花括号(或do
和end
)中编写块代码
clock() { dong }
或更简单
clock { dong }