2012-03-18 47 views
0

時不能設置變量相同的名稱,方法名考慮下面的代碼ruby​​ koan? - 映射

def salt 
    [] 
end 

def pepper 
    salt = salt.map{ |grain| 'ok' } 
end 

給出以下結果:

NoMethodError (undefined method `map' for nil:NilClass): 

爲什麼這些情況正是導致錯誤?這是意想不到的。

回答

5

因爲您的本地變量saltshadowing方法salt。由於剛剛定義了變量salt,因此其值爲nil。您可以通過在實例上明確調用salt來解決此問題,以獲取該方法:

def pepper 
    salt = self.salt.map{ |grain| 'ok' } 
end 
+0

有趣。他們這樣做,似乎很奇怪,而不是計算後設置。但它適用於其他情況,例如定義無效變量或例如:'a,b = [x]',所以a == x和b == nil – 2012-03-18 05:20:10

+1

@PeterEhrlich只要您執行了'foo ='' ,將定義'foo'。這意味着像'foo = foo'這樣的結果'foo'是'nil'而不是'NameError'。 – 2012-03-18 05:24:28