2014-02-20 66 views
5

在Perl中,我們可以使用__SUB__來獲取對當前子例程的引用。 Ruby有類似嗎?用於Ruby的Perl的__SUB__模擬器

例如,讓我們寫在Perl匿名階乘子程序:

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

在Ruby中我會首先創建一個名爲方法,然後將其轉換爲拉姆達:

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

fact = method(:factorial).to_proc 

我覺得這是不是編寫遞歸lambda表達式的最佳方法。我錯過了什麼?

+1

不知道有什麼內置的,但你可以[在紅寶石(鏈接)Y-組合子(http://www.sbf5.com/~使用cduan/technical/ruby​​/ycombinator.shtml)以避免命名該方法=) – maerics

+0

@maerics,如果你只是發佈,並在這裏如何使用y-combinator,這將是一個答案。 – ikegami

+0

@maerics,謝謝。不是我正在尋找的,但它的工作原理。 – user2422869

回答

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