2010-07-24 81 views
2

我在想,爲什麼被包含的模塊的方法混入到任何後續的類定義中(就好像類中包含了它自己一樣)?在ruby mixins中的奇怪繼承

module Foo 
    def bar 
    print "#{self}\n" 
    end 
end 

class Bar 
end 

begin 
    Bar.bar 
rescue NoMethodError 
    puts "There is no Bar.bar\n" 
end 

include Foo 

bar 
Bar.bar 
Bar.new.bar

打印:

 
There is no Bar.bar 
main 
Bar 
#<Bar:0xb73f2048> 

這是預期的行爲?爲什麼?

+0

你期待什麼? – 2010-07-24 17:38:34

回答

2

如果在程序中包含Foo但不包含任何類或方法,那麼它將包含在當前作用域中,即main對象。

你可以通過修改你的杆法以下

def bar 
    print "InBar class: #{self.class} value: #{self}\n" 
    end 

,然後在年底

2.bar 
Fixnum.bar 

添加以下兩行這會給你下面的輸出

測試這個
There is no Bar.bar 
InBar class: Object value: main 
InBar class: Class value: Bar 
InBar class: Bar value: #<Bar:0x21ecec> 
InBar class: Fixnum value: 2 
InBar class: Class value: Fixnum 
+0

'main'實際上不是一個類,它是一個對象。因爲「包括」不應該(嚴格)在頂層提供。儘管如此,'include'可以作爲一種特殊情況(便利方法)使用,但其行爲是將該模塊混合到「Object」 – horseyguy 2010-07-24 23:49:45

+0

@banister中。謝謝手指比腦子快。適當編輯 – 2010-07-25 05:34:50

2

an include在頂層混合模塊爲Object。就其被混合到Object而言,它在所有方面都可用作實例方法。