2014-02-20 18 views
5

In Perl können wir __SUB__ verwenden, um die Referenz auf das aktuelle Unterprogramm zu bekommen. Gibt es ein Analogon für Ruby?Perl __SUB__ analog für Ruby

Zum Beispiel lassen Sie sich ein anonymes faktorielles Unterprogramm in Perl schreiben:

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

In Ruby würde ich eine benannte Methode zuerst erstellen und dann auf Lambda konvertieren:

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

fact = method(:factorial).to_proc 

Ich fühle es ist nicht der beste Weg, rekursive lambdas zu schreiben. Habe ich etwas verpasst?

+1

nicht sicher, ob es etwas gibt, built-in, aber man konnte die [y-combinator in Ruby (link)] verwenden (http://www.sbf5.com/~ cduan/technisch/ruby ​​/ ycombinator.shtml) zu vermeiden, dass die Methode der Benennung =) – maerics

+0

@maerics, Wenn Sie einfach nur, dass und wie hier posten den y-combinator zu verwenden, wäre es eine Antwort sein. – ikegami

+0

@maerics, danke. Nicht genau das, was ich suche, aber es funktioniert. – user2422869

Antwort

2

Ich glaube nicht, dass Rubin bietet jede Einbau-Dienstprogramme, die Sie Rekursion helfen ausführen, ohne zuerst die Funktion zu benennen; aber man konnte use the Y-combinator in Ruby tun:

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