2012-11-05 17 views
5

chodzi Zmiękczanie w Ruby 1.9.x, używam go w niektórych miejscach, i może być tłumaczone jak zasadzie wspierania domyślnych parametrów do argumentów proc:Ruby Reverse Currying: Czy to możliwe?

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 

bardzo przydatne, prawda? Chodzi o to, że chciałabym móc curry na odwrót, to znaczy, wypełnić ostatni argument mojego proca losową wartością. Tak:

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

mój pożądany rezultat byłby to 3. zwraca -3.

Odpowiedz

1

myślę, że nie ma bezpośredni sposób to robić i co robisz jest nieco podejrzanie, prawdopodobnie istnieje lepsze rozwiązanie problemu niż back-currying

, co można zrobić, aby osiągnąć pożądany rezultat jest okład więcej procuje wokół proca:

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

w rzeczywistości można zmienić kolejność arguments w dowolny sposób, ale wierz mi, że robi się bałagan bardzo szybko

+0

HUMM, wygląda dość czyste, zamiar spróbować. Przypadek użycia polega na replikowaniu w pewnym miejscu tego samego zachowania, jakie uzyskujesz z posiadania domyślnych argumentów dotyczących metod, które można ustawić tylko od ostatniego argumentu w tył. Chciałem zastosować tę samą metodę i zastąpić domyślny argument inną wartością w innym kontekście. – ChuckE