chodzi your comment:
Dziwne, ale zamienia argumentów podczas wykonywania
W rzeczywistości, porządek argumentów jest zachowany.
curry
zwraca nowy proces, który skutecznie zbiera argumenty, dopóki nie będzie wystarczającej liczby argumentów do wywołania oryginalnej metody/proc (w oparciu o jej aritę). Osiąga się to przez powracających proca pośrednimi:
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}
Możesz przekazać dowolną liczbę argumentów naraz do curry 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}
Puste argumenty są ignorowane:
curried_proc[1][][2][][3] #=> {:a=>1, :b=>2, :c=>3}
jednak oczywiście nie można zmienić kolejności argumentów.
Alternatywą do zmiękczania jest częściowe stosowanie która zwraca nowy proc o niższej Arity przez zamocowanie jednej lub więcej argumentów. W przeciwieństwie curry
, nie ma wbudowanej metody częściowego zastosowania, ale można łatwo pisać własne:
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"]
utrwalacze ostatni argument:
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"]
oczywiście, nie jesteś ograniczone do ustalania pojedynczych argumentów. Można na przykład zwrócić proc, która pobiera tablicę i konwertuje go na liście argumentów:
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"]
Chcesz oba argumenty mają być przekazywane z zwaną metodą przez plonowanie, lub chcesz, aby określić jeden argument przy składaniu blok do metody? –
Pamiętaj tylko, że '['foo', 'bar'].each (& my_method) 'nie miałoby sensu, ponieważ' each' zawsze przyniesie tylko jeden element. Nie odpowiadając na twoje pytanie, ale sprawdź '['foo', 3] .each_slice (2, & my_method)'. – ndn
Myślę, że "curry" może być kluczem do tego pytania. – sawa