2013-03-05 13 views
8

Quando ho usato respond_with e superato un hash letterale, mi ha dato l'errore:Perché le parentesi influiscono sugli hash?

syntax error, unexpected tASSOC, expecting '}' 
`respond_with {:status => "Not found"}` 

Tuttavia, quando ho racchiuso l'hash letterale tra parentesi in questo modo:

respond_with({:status => "Not found"}) 

la funzione viene eseguito senza un intoppo. Perché le parentesi fanno la differenza? Non è un hash una chiamata chiusa?

+0

Non so esattamente il perché. Ma è una buona cosa sapere se, se si desidera evitare parentesi quando si utilizza hash come parametro, è possibile evitare che tutte le funzioni per farlo funzionare: 'answer_with: status =>" Non trovato "' – TimPetricola

+0

@TimPetricola Oh wow. Funziona anche per più valori. Grazie! Ora perché posso evitare le parentesi graffe quando lo si utilizza come parametro? – RileyE

+0

Vedi la risposta di Holger per quello. – TimPetricola

risposta

12

Quando si chiama un metodo, la parentesi graffa di apertura subito dopo il nome del metodo viene interpretata come l'inizio di un blocco. Questo ha la precedenza sull'interpretazione come un hash. Un modo per aggirare il problema è usare la parentesi per forzare l'interpretazione come argomento del metodo. A titolo di esempio, si prega di notare la differenza di significato di queste due chiamate di metodo:

# interpreted as a block 
[:a, :b, :c].each { |x| puts x } 

# interpreted as a hash 
{:a => :b}.merge({:c => :d}) 

Un altro modo è quello di solo sbarazzarsi di parentesi graffe, come si può sempre saltare le staffe sul l'ultimo argomento di un metodo. Ruby è "intelligente" abbastanza da interpretare tutto ciò che sembra un elenco di associazioni alla fine di un elenco di argomenti come un singolo hash. Date un'occhiata a questo esempio:

def foo(a, b) 
    puts a.inspect 
    puts b.inspect 
end 

foo "hello", :this => "is", :a => "hash" 
# prints this: 
# "hello" 
# {:this=>"is", :a=>"hash"} 
+0

Ruby ha un sacco di fantastiche "ipotesi". Cosa intendi con "alla fine"? Potresti avere parametri prima e poi avere ancora l'hash senza parentesi? – RileyE

+1

@RileyE Il primo parametro di 'respond_with' sono le risorse che stai restituendo, ed è un numero arbitrario di risorse. –

+0

@RileyE Vedi la modifica della mia risposta con alcuni esempi. –

Problemi correlati