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"}
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
@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
Zobacz odpowiedź Holgera na to. – TimPetricola