2013-03-18 25 views
9

Mi piacerebbe avere un metodo che accetta un hash e un argomento di parole chiave opzionale. Ho provato la definizione di un metodo come questo:Come posso evitare che un argomento posizionale venga espanso in argomenti di parole chiave?

def foo_of_thing_plus_amount(thing, amount: 10) 
    thing[:foo] + amount 
end 

Quando invoco questo metodo con l'argomento chiave, funziona come mi aspetto:

my_thing = {foo: 1, bar: 2} 
foo_of_thing_plus_amount(my_thing, amount: 20) # => 21 

Quando esco fuori l'argomento parola chiave, tuttavia, l'hash viene mangiato:

foo_of_thing_plus_amount(my_thing) # => ArgumentError: unknown keywords: foo, bar 

Come posso evitare che ciò accada? Esiste qualcosa come un anti-splat?

+0

Grazie. Almeno ora so una soluzione: usa il parametro keyword ogni volta. Piuttosto fastidioso. –

risposta

4

Si tratta di un errore risolto in Ruby 2.0.0-p247, vedere this issue.

+0

Il problema collegato riporta il backporting. Cosa significa questo per me, praticamente? Posso aggiornare la mia versione 2.0.0-p247 di ruby ​​in qualche modo? O significa qualunque versione rilasciata di 2.0.0-pX dopo questo avrebbe la correzione? –

1

Che dire

def foo_of_thing_plus_amount(thing, opt={amount: 10}) 
    thing[:foo] + opt[:amount] 
end 

my_thing = {foo: 1, bar: 2} # {:foo=>1, :bar=>2} 
foo_of_thing_plus_amount(my_thing, amount: 20) # 21 
foo_of_thing_plus_amount(my_thing) # 11 

?

+0

Questo funziona per l'ipotetico esempio dell'OP. Ma se la definizione del metodo originale includeva più argomenti di parole chiave opzionali, la linea di esempio (che risulta in 21) li rimuoveva nell'argomento 'opt' ricevuto, perché sarebbe passata solo la chiave' amount'. Così com'è, il mio caso d'uso corrente è l'esempio ipotetico, quindi questo aiuta. –