2013-03-05 11 views
8

Kiedy użyłem respond_with i przeszedł dosłownego hash, to dał mi błąd:Dlaczego nawiasy mają wpływ na skróty?

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

Jednak, kiedy zamknięty dosłowne hash w nawiasach tak:

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

funkcja działa bez zaczep. Dlaczego nawiasy mają znaczenie? Czy mieszanie nie jest połączeniem zamkniętym?

+0

Nie wiem dokładnie dlaczego. Ale dobrze wiedzieć, czy to, jeśli chcesz uniknąć nawiasów przy użyciu skrótu jako parametru, możesz uniknąć ich wszystkich, aby to zadziałało: 'response_with: status =>" Nie znaleziono "' – TimPetricola

+0

@TimPetricola Oh wow. Działa to również dla wielu wartości. Dzięki! Dlaczego więc mogę uniknąć nawiasów klamrowych, gdy używam go jako parametru? – RileyE

+0

Zobacz odpowiedź Holgera na to. – TimPetricola

Odpowiedz

12

Podczas wywoływania metody otwierający nawias klamrowy bezpośrednio po nazwie metody jest interpretowany jako początek bloku. Ma to pierwszeństwo przed interpretacją jako hash. Jednym ze sposobów obejścia problemu jest użycie nawiasów w celu wymuszenia interpretacji jako argumentu metody. Jako przykład, należy zwrócić uwagę na różnicę w rozumieniu tych dwóch wywołań metod:

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

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

Innym sposobem jest po prostu pozbyć się nawiasów klamrowych jak zawsze można pominąć nawiasy na ostatni argument metody. Ruby jest "sprytna" na tyle, by interpretować wszystko, co wygląda jak lista skojarzeń na końcu listy argumentów jako pojedynczy skrót. Proszę spojrzeć na ten przykład:

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 ma wiele fajnych "założeń". Co masz na myśli mówiąc "na końcu"? Czy mógłbyś mieć parametry przed nim, a następnie nadal mieć skrót bracketless? – RileyE

+1

@RileyE Pierwszym parametrem "response_with" są zasoby, które obsługujesz, i jest to dowolna liczba zasobów. –

+0

@RileyE Zobacz edycję mojej odpowiedzi z kilkoma przykładami. –

Powiązane problemy