2012-12-07 253 views
0

如果我有一類和模塊:紅寶石模塊包括

class Foo 
end 

module WhackyFoo 
    def whacky 
    puts 'shits whacky!' 
    end 
end 

我爲什麼可以這樣做:

include WhackyFoo 
Foo.new.whacky 
# => shits whacky! 

有人可以解釋或點我到這種用法說明了Ruby的文檔?

回答

4

因爲當您將模塊包含在頂層時,它將被包含到一個特殊對象main中。在main上定義的任何方法(包括從模塊包含的那些方法)都成爲Object(以及因此所有對象)的私有實例方法。這就是它工作的原因。

如果你有一個模塊插入一個「正常」類(非頂級main),它表現爲你所期望

module WhackyFoo 
    def whacky 
    puts 'shits whacky!' 
    end 
end 

class Foo 
end 

class Bar 
    include WhackyFoo 
end 


Bar.new.whacky # >> "shits whacky!" 

Foo.new.whacky # ~> -:16:in `<main>': undefined method `whacky' for #<Foo:0x007fa92984d968> (NoMethodError) 
+0

awww打敗我吧D: –

+0

所以這種方法無處不在。如果我想將它包含到Foo中,我想我必須命名空間。 – Billy

+0

@比利:你必須將它包含在Foo中。 –

1

include最終被呼籲的對象,這就是一切紅寶石歸結爲。由於每個類都從Object繼承,所以在模塊中定義的方法將最終包含在每個類中。