2012-11-05 7 views
5

Per quanto riguarda accattivarsi in Ruby 1.9.x, ho usato in alcuni luoghi, e può essere tradotto come fondamentalmente sostenere i parametri di default per gli argomenti proc:Ruby Reverse Currying: è possibile?

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 

molto utile, giusto? La cosa è che mi piacerebbe essere in grado di curry al contrario, cioè, riempire l'ultimo argomento del mio proc con un valore casuale. Così:

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

il mio risultato desiderato sarebbe 3. questo restituisce -3.

risposta

1

Penso che ci sia un modo diretto di fare questo e quello che stai facendo è un po 'dubbia, probabilmente è meglio soluzione al vostro problema di back-currying

che cosa si potrebbe fare per raggiungere il risultato desiderato è avvolgente più procs intorno ai vostri procs:

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

infatti è possibile riordinare gli argomenti qualsiasi modo si desidera, ma mi creda che diventa disordinato molto rapidamente

+0

Humm, sembra abbastanza pulito, andando a fare un tentativo. Il caso d'uso è quello di replicare in un determinato punto lo stesso comportamento derivante dall'avere argomenti predefiniti sui metodi, e questi possono essere impostati solo dall'ultimo argomento all'indietro. Volevo utilizzare lo stesso metodo e sostituire l'argomento predefinito con un valore diverso in un contesto diverso. – ChuckE