2015-02-12 25 views
5

Non possiamo passare argomenti di parole chiave come hash con chiavi di stringa, gli argomenti di parole chiave funzionano solo con hash come chiavi di simboli.Perché gli argomenti delle parole chiave devono essere passati come hash con le chiavi dei simboli, non con le chiavi di stringa in Ruby?

Un semplice esempio:

def my_method(first_name:, last_name:) 
    puts "first_name: #{first_name} | last_name: #{last_name}" 
end 

my_method({last_name: 'Sehrawat', first_name: 'Manoj'}) 
#=> first_name: Manoj | last_name: Sehrawat 

my_method({first_name: 'Bob', last_name: 'Marley'}) 
#=> first_name: Bob | last_name: Marley 

my_method({'first_name' => 'Kumar', 'last_name' => 'Manoj'}) 
#=> Error: missing keywords: first_name, last_name (ArgumentError) 

Qual è il ragionamento dietro di esso?

+0

Penso che l'idea è simile a http://stackoverflow.com/questions/8189416/why- use-symbols-as-hash-keys-in-ruby – freemanoid

+0

@freemanoid Io non la penso così. In questo caso, la sintassi riguarda come accettare una variabile locale. Non c'è nessun simbolo coinvolto. – sawa

risposta

1

Anche se argomenti chiave possono essere passati all'interno di un hash, credo che l'uso principalmente destinato è quello di utilizzare la key: value sintassi direttamente:

my_method(first_name: 'Bob', last_name: 'Marley') 

Per quanto riguarda il presente modulo è interessato, non c'è una chiave simbolo (o chiave dell'array) qui. La sintassi key: value consiste nel significare direttamente gli argomenti delle parole chiave.

La mia speculazione è che, poiché questa sintassi coincide con l'hash con i tasti dei simboli e le parentesi omesse, ha senso accettare anche coppie di valori di parole chiave tramite hash con i tasti dei simboli. E potrebbe essere il caso che sia stato progettato in modo da essere reso compatibile con il trucco di passare un hash con i tasti simbolo, che è stato usato prima che fosse introdotta questa sintassi.

+0

Potrebbe essere sbagliato. Scusa se lo è. – sawa

+1

La sintassi 'symbol: key' in 1.9 è stata effettivamente introdotta * specificatamente * come percorso di migrazione verso argomenti di parole chiave" reali ". –

2

La versione breve sarebbe perché Matz dice così - su questo RubyMine issue commenta

Sono negativo per la proposta. La mia opinione è che non si dovrebbero (o non si usano più) stringhe come parole chiave.

Questo problema reale riguarda qualcosa che accade come conseguenza di ciò, ma se Matz dice no, è improbabile che accada. Non so se ha ulteriormente esposto il motivo per cui è contrario.

2

L'attuazione di * e ** potrebbe essere rilevante:

def gather_arguments(*arguments, **keywords) 
    puts "arguments: #{arguments.inspect}" 
    puts " keywords: #{keywords.inspect}" 
end 

gather_arguments('foo' => 1, bar: 2, 'baz' => 3, qux: 4) 

uscita:

arguments: [{"foo"=>1, "baz"=>3}] 
keywords: {:bar=>2, :qux=>4} 
+0

Stai dicendo che le chiavi stringa sono riservate in modo che possano essere distinte dagli argomenti delle parole chiave e interpretate come parte degli argomenti hash? Se questo è il caso, non sono d'accordo. – sawa

+1

@sawa Non sto dicendo che questo è il motivo. Solo che il comportamento corrente di '*' e '**' cambierebbe (e forse spezzerebbe il codice esistente), se fossero permessi argomenti di parole chiave con chiavi stringa. – Stefan