在Ruby中,你可以調用沒有一個接收器和不帶參數列表的方法。然而,這意味着存在歧義:foo
的含義是「暗示接收方self
上的呼叫方法foo
沒有參數,即是否等同於self.foo()
」或是否意味着「取消引用變量foo
」? Ruby不知道你的意思,所以有一些簡單的規則。
對於本地變量,規則是foo
是總是一個方法調用,除非foo
是在分析時靜態已知是一個局部變量。那麼,它什麼時候被靜態地稱爲變量?在使用前有一個分配給解析的變量(但不一定執行!)。
實施例:
foo # method call
if false
foo = 42 # will never be executed, but *will* be parsed
end
foo # variable dereference, since the `foo` assignment was parsed
對於恆定變量,規則是更簡單:Foo
是總是解釋爲一個恆定解除引用。期。
那麼,你如何調用這樣一個名字的方法?簡單:就像我說的那樣,只有沒有參數列表和沒有明確接收者的方法調用纔會產生歧義。所以,如果我們增加雙方或一方的那些,紅寶石就會知道,我們正試圖調用一個方法,而不是取消引用變量:
foo()
self.foo
self.foo()
Foo()
self.Foo
self.Foo()
當然,在這個例子中,你上面給了,只有第一個將工作。當您在頂層定義方法時,即使該接收者爲self
,也會將其作爲private
方法添加到Object
,並且private
方法只能稱爲,而不包含明確的接收方。因此,self.Foo
將不起作用,因爲Foo
是私人的。 (除IRB以外,爲方便起見,頂級方法爲public
。)
是的。你是對的! :)感謝您的解釋。 – 2013-03-07 13:08:29
赫姆..你是絕對正確的這裏是另一個考驗 - '>> X = 10 => 10 >>高清X >> P 「喜」 >>結束 =>零 >>的eval(:X .id2name) => 10' – 2013-03-08 09:46:29