我已經發現在一些代碼,執行以下操作的方法:這種方法名稱/局部變量混合會發生什麼?
def method1
method1 = [1, 2, 2, 3, 4, 5, 5]
return method1.uniq!
end
如何紅寶石處理?我知道這是不好的代碼,但紅寶石如何知道如何處理'method1.uniq!' ?它應該使用該方法還是局部變量?
感謝
我已經發現在一些代碼,執行以下操作的方法:這種方法名稱/局部變量混合會發生什麼?
def method1
method1 = [1, 2, 2, 3, 4, 5, 5]
return method1.uniq!
end
如何紅寶石處理?我知道這是不好的代碼,但紅寶石如何知道如何處理'method1.uniq!' ?它應該使用該方法還是局部變量?
感謝
你可以在你的問題中的代碼的終端(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
局部變量之間的區別。
Ruby將首先查找局部變量,然後查找方法。如果您在定義了一個名稱相同的變量後嘗試調用derp方法,則可以使用'self.derp'來確保調用該方法。 – Emily
是的,我知道代碼返回什麼,想知道Ruby如何在內部處理它。看來,我的Ruby 1.8.7變得困惑,並消耗大量的內存來獲得結果,而1.9.2沒有問題。 –
@Emily感謝您的澄清。任何關於1.8.7和1.9.2差異的想法? –
如果你做defined?(method1)
它會告訴你,有一個局部變量method1,如果你做defined?(method1())
它會說有一個方法method1
。
局部變量和方法之間的語法相似意味着當您在對象內調用setter方法時,您必須執行self.foo = 42
。
除了你的問題:'method1.uniq!'在這裏不是個好主意。 'uniq'會更好。原因:'method1 = [1,2,3,4,5]; method1.uniq!'產生'nil',因爲'uniq!'沒有找到重複項。 – knut
我不認爲這是錯誤的代碼。我們經常需要返回一些東西,並且返回值的理想名稱通常是方法的名稱本身。不錯,只要你知道ruby首先查找局部變量 –