2011-03-30 100 views
19

我試圖定義一對模塊輕鬆一些實例和類方法的其他類加內,這裏是我在做什麼:紅寶石 - 擴展模塊另一個模塊

module Foo 
    module Bar 
    def speak 
     puts "hey there" 
    end 
    end 
    module Baz 
    extend Foo::Bar 

    def welcome 
     puts "welcome, this is an instance method" 
    end 
    end 
end 

class Talker 
    include Foo::Baz 
end 

Talker.new.welcome 
Talker.speak 

的輸出這是:

welcome, this is an instance method 
undefined method 'speak' for Talker.class (NoMethodError) 

我期待Talker有'speak'方法,因爲它包含Foo :: Baz,它本身擴展了Foo :: Bar。

我缺少什麼?

+0

所以如果我讓Baz成爲一個類而不是一個模塊,並且我改變了Talker,所以它是Baz的子類,我的示例工作。但是,如果不讓巴茲成爲一個班級,我可以做什麼? (而不必像Talker :: Foo :: Bar.speak那樣做) – codecraig 2011-03-30 14:16:12

回答

20

你可以試試這個:

module Baz 
    extend Foo::Bar 

    def self.included(base) 
    base.send :extend, Foo::Bar 
    end 

    def welcome 
    puts "welcome, this is an instance method" 
    end 
end 

這將自動擴展的所有類包括巴茲。

+0

不錯,謝謝!這給了我想要的東西。 – codecraig 2011-03-30 14:37:14

+1

爲什麼2延伸Foo :: Bar?一個在裏面,一個在外面。 – shajin 2014-04-14 13:29:58

+1

First extend將Foo :: Bar的類級方法添加到Baz。第二個將Foo :: Bar的方法添加到包括Baz的所有類和模塊中。 – 2014-04-15 16:42:59

4

試試這個:

class Talker 
    extend Foo::Baz 
end 

,因爲你要調用Talker.speak作爲一個類的方法,而不是作爲一個實例方法(如Talker.new.speak),你必須包括富:巴茲在方法本身將採取方法本身。

一種可能性是使用「擴展」(同上),另一個是改變它的eigenclass:

class Talker 
    class << self 
    include Foo::Baz 
    end 
end