ruby - Perl 的 __SUB__ 模拟 Ruby

标签 ruby lambda

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

例如,让我们用 Perl 编写一个匿名阶乘子程序:

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 的最佳方式。我错过了什么吗?

最佳答案

我认为 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

关于ruby - Perl 的 __SUB__ 模拟 Ruby,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21918800/

相关文章:

java - 使用流操作从 String 中找到最小和最大的子串

java - Java 8 中特殊 lambda 表达式的最短表示法

python - Lambda 函数要求输入两次,

ruby - 未能要求本地 gem

ruby - 如何防止层次结构中的循环引用?

在字符类中使用 OR 的 Ruby 正则表达式

ruby - mongoid 中嵌入关系中的真正多态性

ruby - 将 "2015-03-18 22:00"转换为 Time 对象的最佳方法

python - 在循环中调用函数两次或更多次

java - 在 Java8 中使用 lambda 仅在不为空时过滤值