Perl用于Ruby的__SUB__类比

use*_*869 5 ruby lambda

在Perl中,我们可以__SUB__用来获取当前子例程的引用.Ruby有类似的吗?

例如,让我们在Perl中编写一个匿名的factorial子例程:

my $fact = sub {
    $_[0] > 1 ? $_[0] * __SUB__->($_[0] - 1) : 1;
};
Run Code Online (Sandbox Code Playgroud)

在Ruby中,我首先创建一个命名方法,然后将其转换为lambda:

def factorial(n) 
  n > 1 ? n * factorial(n - 1) : 1
end

fact = method(:factorial).to_proc
Run Code Online (Sandbox Code Playgroud)

我觉得这不是编写递归lambda的最佳方法.我错过了什么?

mae*_*ics 2

我认为 Ruby 没有提供任何内置实用程序来帮助您在不先命名函数的情况下执行递归;但是,您可以使用 Ruby 中的 Y 组合器来执行此操作:

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
Run Code Online (Sandbox Code Playgroud)