从其关联的块中递归调用Ruby方法.还有其他方法吗?

Dig*_*oss 10 ruby

我想出来了:

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)

还有另外一种方法吗?

Ian*_*les 4

这取决于您的实际代码的细节,但根据您的示例,如果您事先命名该块,则可以避免在函数中生成该值和该块。例如:

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 组合器的一个很好的应用。一旦我有更好的消息给你,我会更新此消息。