2012-11-05 9 views
5

Bezüglich currying in Ruby 1.9.x, ich habe es in einigen Orten wurden verwendet und kann wie im Grunde unterstützt Standardparameter auf die proc Argumente übersetzt werden:Ruby Reverse Currying: Ist das möglich?

p = proc {|x, y, z|x + y + z} 
p.curry[1] #=> returns a lambda 
p.curry[1, 2] #=> returns a lambda 
p.curry[1, 2, 3] #=> 6 
p2 = p.curry[1, 2] 
p2.(2) #=> 5 
p2.(4) #=> 7 

sehr praktisch, nicht wahr? Das ist, ich würde gerne in der Lage sein, rückwärts zu curren, das heißt, fülle das letzte Argument meines Procs mit einem zufälligen Wert. Wie folgt:

p = proc{|x, y| x - y }.curry[1] 
p.(4) 

mein gewünschtes Ergebnis wäre 3. das gibt -3 zurück.

Antwort

1

Ich denke, es gibt keinen direkten Weg, dies zu tun und was Sie tun, ist ein wenig schmuddelig, es wahrscheinlich bessere Lösung für Ihr Problem ist als Back-currying

was Sie gewünschtes Ergebnis zu erzielen tun können, ist wickeln mehr procs um Ihre procs:

p = proc{|x, y| x - y} 
q = proc{|y, x| p[x, y]} 
q.curry[1].(4) 

in der Tat Sie Argumente beliebig neu anordnen können Sie wollen, aber ich glaube, dass es chaotisch wird sehr schnell

+0

humm, sieht sauber genug, geht es zu versuchen. Der Anwendungsfall besteht darin, an einer bestimmten Stelle das gleiche Verhalten zu replizieren, das Sie von Standardargumenten für Methoden erhalten, und diese können nur vom letzten Argument zurück gesetzt werden. Ich wollte die gleiche Methode verwenden und das Standardargument durch einen anderen Wert in einem anderen Kontext ersetzen. – ChuckE