2013-07-13 38 views
0

考慮簡單的下面的代碼:修改預定義的「PARAMS」在末日變種使得它無

post '/xxx' do 
    puts params 
end 

能正常工作。現在考慮下面的修改

post '/xxx' do 
    params = params 
    puts params 
end 

現在params是零!我對Ruby很陌生,不知道爲什麼會發生這種行爲。很顯然,我不想執行無用的params = params表達式,但是我正在嘗試修改params,並發現它總是變成nil

回答

5

在第一個版本中,您調用一個名爲params的方法,並將其返回值傳遞給puts

在第二個版本中,您將創建一個名爲params(它隱藏了具有相同名稱的方法)並將其分配給自己的局部變量。

請看下面的例子:

def foo 
    1 
end 

p foo # outputs `1` 

foo = foo 

p foo # outputs `nil` 

它可能不是很明顯,這種情況正在發生,因爲在Ruby訪問本地變量,並呼籲self的方法完全相同看起來是一樣的。

+0

那對我來說非常愚蠢。我知道在其他語言中的這種行爲,它應該打擊我。 –

+1

不要對自己太難。方法調用中缺少所需的括號可能是我最不喜歡的Ruby。很容易理解編寫良好的Ruby代碼的意圖,但理解它的實現方式比Python這樣的語言要花費更多的精力,因爲這種模糊性。 – georgebrock

相關問題