加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Perl用于Ruby的__SUB__类比

发布时间:2020-12-15 23:34:01 所属栏目:大数据 来源:网络整理
导读:在Perl中,我们可以使用__SUB__来获取对当前子例程的引用. Ruby有类似的吗? 例如,让我们在Perl中编写一个匿名的factorial子例程: my $fact = sub { $_[0] 1 ? $_[0] * __SUB__-($_[0] - 1) : 1;}; 在Ruby中,我首先创建一个命名方法,然后将其转换为lambda:
在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的最佳方法.我错过了什么?

解决方法

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读