2009-08-26 9 views
5

Mam sekwencję kodu poniżej w akcji kontrolera szyn. Przed IF parametry zawierają parametry żądania, zgodnie z oczekiwaniami. Po nim parametry są zerowe. Czy ktoś może wyjaśnić, co się tutaj dzieje?przypisz/zamień skróty params w szynach

if false 
    params = {:user => {:name => "user", :comment => 'comment'}} 
end 

Dziękuję.

Odpowiedz

10

Wartość params, która zawiera parametry żądania, jest w rzeczywistości wywołaniem metody, które zwraca wartość mieszającą zawierającą parametry. Twoja linia params = przypisuje zmiennej lokalnej o nazwie params.

Po bloku if false, Ruby widział lokalną zmienną params więc jeśli odnoszą się do params później w metodzie zmienna lokalna ma pierwszeństwo przed wywołaniem metody o tej samej nazwie. Jednak ponieważ twoje zadanie params = znajduje się w bloku if false, zmiennej lokalnej nigdy nie przypisuje się wartości, więc zmienna lokalna to nil.

Jeśli spróbujesz odwołać się do zmiennej lokalnej przed przypisaniem do niego dostaniesz NameError:

irb(main):001:0> baz 
NameError: undefined local variable or method `baz' for main:Object 
     from (irb):1 

Jednak jeśli jest przypisanie do zmiennej, która nie jest w ścieżce wykonywania kodu następnie Ruby utworzył zmienną lokalną, ale jej wartość to nil.

irb(main):007:0> baz = "Example" if false 
=> nil 
irb(main):008:0> baz 
=> nil 
+0

"Ruby widział lokalne paramy" naprawdę, Ruby ??? NAPRAWDĘ!!!??? O_o (przepraszam, ale to mnie kosztowało kilka dni ... Widzenie nie jest wykonywane, czyż nie?) – steffen