In Bezug auf your comment:
Seltsam, aber es tauscht Argumente während der Performance
Tatsächlich ist die Argumentreihenfolge erhalten.
curry
gibt einen neuen Proc zurück, der effektiv Argumente sammelt, bis genügend Argumente vorhanden sind, um die ursprüngliche Methode/proc (basierend auf ihrer Arity) aufzurufen. Dies wird durch die Rückkehr Zwischen Procs erreicht:
def foo(a, b, c)
{ a: a, b: b, c: c }
end
curried_proc = foo.curry #=> #<Proc:0x007fd09b84e018 (lambda)>
curried_proc[1] #=> #<Proc:0x007fd09b83e320 (lambda)>
curried_proc[1][2] #=> #<Proc:0x007fd09b82cfd0 (lambda)>
curried_proc[1][2][3] #=> {:a=>1, :b=>2, :c=>3}
Sie eine beliebige Anzahl von Argumenten übergeben kann auf einmal zu einer curried proc:
curried_proc[1][2][3] #=> {:a=>1, :b=>2, :c=>3}
curried_proc[1, 2][3] #=> {:a=>1, :b=>2, :c=>3}
curried_proc[1][2, 3] #=> {:a=>1, :b=>2, :c=>3}
curried_proc[1, 2, 3] #=> {:a=>1, :b=>2, :c=>3}
Leere Argumente werden ignoriert:
curried_proc[1][][2][][3] #=> {:a=>1, :b=>2, :c=>3}
jedoch Sie können die Reihenfolge der Argumente natürlich nicht ändern.
Eine Alternative zu currying ist Teil Anwendung, die durch Fixieren einer oder mehrerer Argumente eine neue proc mit niedrigeren arity zurückgibt. Im Gegensatz zu curry
, gibt es keine integrierte Methode für die partielle Anwendung, aber Sie können leicht schreiben Sie Ihre eigene:
my_proc = -> (arg, num) { arg * num }
def fix_first(proc, arg)
-> (*args) { proc[arg, *args] }
end
fixed_proc = fix_first(my_proc, 'foo') #=> #<Proc:0x007fa31c2070d0 (lambda)>
fixed_proc[2] #=> "foofoo"
fixed_proc[3] #=> "foofoofoo"
[2, 3].map(&fixed_proc) #=> ["foofoo", "foofoofoo"]
Oder das letzte Argument Festsetzung:
def fix_last(proc, arg)
-> (*args) { proc[*args, arg] }
end
fixed_proc = fix_last(my_proc, 2) #=> #<Proc:0x007fa31c2070d0 (lambda)>
fixed_proc['foo'] #=> "foofoo"
fixed_proc['bar'] #=> "barbar"
['foo', 'bar'].map(&fixed_proc) #=> ["foofoo", "barbar"]
Natürlich sind Sie nicht beschränkt auf das Reparieren einzelner Argumente. Sie könnten zum Beispiel eine proc zurückgeben, die ein Array nimmt und wandelt es in eine Argumentliste:
def splat_args(proc)
-> (array) { proc[*array] }
end
splatting_proc = splat_args(my_proc)
[['foo', 1], ['bar', 2], ['baz', 3]].map(&splatting_proc)
#=> ["foo", "barbar", "bazbazbaz"]
Wollen Sie beiden Argumente von der aufgerufenen Methode übergeben werden durch Nachgeben oder haben Sie ein Argument angeben mögen bei der Einreichung der Block zur Methode? –
Nur um das zu bemerken "['foo', 'bar'].Jede (& my_method) 'würde keinen Sinn ergeben, da' each' immer nur ein Element ergibt. Beantworte deine Frage nicht, aber überprüfe '['foo', 3] .each_slice (2, & my_method)'. – ndn
Ich denke, dass "Curry" ein Schlüssel zu dieser Frage sein könnte. – sawa