在Perl中,我们可以使用__SUB__
来获取对当前子例程的引用。 Ruby有类似的东西吗?
例如,让我们在Perl中编写一个匿名的factorial子例程:
my $fact = sub {
$_[0] > 1 ? $_[0] * __SUB__->($_[0] - 1) : 1;
};
在Ruby中,我首先创建一个命名方法,然后将其转换为lambda:
def factorial(n)
n > 1 ? n * factorial(n - 1) : 1
end
fact = method(:factorial).to_proc
我觉得这不是编写递归lambda的最佳方法。我错过了什么吗?
答案 0 :(得分:2)
我不认为Ruby提供任何内置实用程序,可以帮助您在不首先命名函数的情况下执行递归;但是,您可以use the Y-combinator in Ruby这样做:
def y_combinator(&generator)
proc { |x|
proc { |*args| generator.call(x.call(x)).call(*args) }
}.call(proc { |x|
proc { |*args| generator.call(x.call(x)).call(*args) }
})
end
factorial = y_combinator do |callback|
proc { |n| n > 1 ? n * callback.call(n - 1) : 1 }
end
factorial.call(5) # => 120