2017-06-29 60 views
0

在IRB控制檯我創建一個類「你好」紅寶石方法作爲實例方法以及

irb(main):001:0> class Hello 
irb(main):002:1> end 
=> nil 

和創建「你好」類以外的一個方法名爲「喜」

類的方法
irb(main):003:0> def hi 
irb(main):004:1> 'hiiii' 
irb(main):005:1> end 
=> :hi 

現在這種方法喜充當類方法以及實例方法

irb(main):006:0> Hello.hi 
=> "hiiii" 
irb(main):007:0> Hello.new.hi 
=> "hiiii" 
irb(main):008:0> hi 
=> "hiiii" 

爲什麼這種方法喜爲g et'使用類'Hello'調用,即使它在'Hello'類上下文之外?

回答

5

在「主」上下文中定義的方法(即不在類或模塊聲明中)在Object上定義。由於每個類(包括(big-C)類)都從Object繼承,因此該方法存在於每個對象和每個類的繼承鏈中。通過在Object上明確定義方法,您可以觀察到相同的行爲:

class Object 
    def foo 
    puts "Hello" 
    end 
end 

class Bar; end 

Bar.foo 
# => Hello 

Bar.new.foo 
# => Hello 

foo 
# => Hello 
+2

還有一件事在這裏玩。在頂層定義的方法成爲'Object'的* private *實例方法,這意味着這兩個調用*應該引發一個異常「private method called」。 **但是在這方面** ** IRb(和* only * IRb)的行爲與Ruby不同,並且使它們公開。所以,當且僅當您在IRB中嘗試它時,它纔有效。 –