我想出来了:
def f x, &b
yield x, b
end
f 4 do |i, b|
p i
f i - 1, &b if i > 0
end
Run Code Online (Sandbox Code Playgroud)
结果:
4
3
2
1
0
Run Code Online (Sandbox Code Playgroud)
还有另外一种方法吗?
这取决于您的实际代码的细节,但根据您的示例,如果您事先命名该块,则可以避免在函数中生成该值和该块。例如:
def f(x, &b)
yield x
end
foo = lambda do |i|
p i
f(i-1,&foo) if i > 0
end
f(4,&foo)
Run Code Online (Sandbox Code Playgroud)
但是,我想找到一个更优雅的解决方案来解决这个问题。我怀疑这将是 Y 组合器的一个很好的应用。一旦我有更好的消息给你,我会更新此消息。