2011-11-17 42 views
3

我已經發現在一些代碼,執行以下操作的方法:這種方法名稱/局部變量混合會發生什麼?

def method1 
    method1 = [1, 2, 2, 3, 4, 5, 5] 
    return method1.uniq! 
end 

如何紅寶石處理?我知道這是不好的代碼,但紅寶石如何知道如何處理'method1.uniq!' ?它應該使用該方法還是局部變量?

感謝

+0

除了你的問題:'method1.uniq!'在這裏不是個好主意。 'uniq'會更好。原因:'method1 = [1,2,3,4,5]; method1.uniq!'產生'nil',因爲'uniq!'沒有找到重複項。 – knut

+0

我不認爲這是錯誤的代碼。我們經常需要返回一些東西,並且返回值的理想名稱通常是方法的名稱本身。不錯,只要你知道ruby首先查找局部變量 –

回答

2

你可以在你的問題中的代碼的終端(irb),類型打開一個紅寶石會話,並查看結果自己。

Loading development environment (Rails 3.1.0) 
ruby-1.9.2-p290 :001 > def derp 
ruby-1.9.2-p290 :002?> derp = [1,2,3,3,3] 
ruby-1.9.2-p290 :003?> derp.uniq 
ruby-1.9.2-p290 :004?> end 
=> nil 
ruby-1.9.2-p290 :005 > derp 
=> [1, 2, 3] 

要回答你的問題,紅寶石知道方法derp,其範圍內derp局部變量之間的區別。

+5

Ruby將首先查找局部變量,然後查找方法。如果您在定義了一個名稱相同的變量後嘗試調用derp方法,則可以使用'self.derp'來確保調用該方法。 – Emily

+0

是的,我知道代碼返回什麼,想知道Ruby如何在內部處理它。看來,我的Ruby 1.8.7變得困惑,並消耗大量的內存來獲得結果,而1.9.2沒有問題。 –

+0

@Emily感謝您的澄清。任何關於1.8.7和1.9.2差異的想法? –

0

如果你做defined?(method1)它會告訴你,有一個局部變量method1,如果你做defined?(method1())它會說有一個方法method1

局部變量和方法之間的語法相似意味着當您在對象內調用setter方法時,您必須執行self.foo = 42

相關問題