2013-03-07 32 views
2

我在玩IRB的main中的方法定義並調用它們。與紅寶石IRB的方法調用混淆

def show 
p "hi" 
end 
#=> nil 

show 
#"hi" 
#=> "hi" 

self.show 
#"hi" 
#=> "hi" 

以上是很好的理解。

現在讓我們嘗試不同的東西:

def Foo 
p "hi" 
end 
#=> nil 

Foo 
#NameError: uninitialized constant Foo 
     #from (irb):4 
     #from C:/Ruby193/bin/irb:12:in `<main>' 

儘管對Foo呼叫已拋出錯誤如上,請問下面的刪除?

self.Foo 
#"hi" 
#=> "hi" 

回答

4

在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。)

+0

是的。你是對的! :)感謝您的解釋。 – 2013-03-07 13:08:29

+0

赫姆..你是絕對正確的這裏是另一個考驗 - '>> X = 10 => 10 >>高清X >> P 「喜」 >>結束 =>零 >>的eval(:X .id2name) => 10' – 2013-03-08 09:46:29