2015-06-29 134 views
4

給定一個基本的ruby類和模塊,只要類的一個實例被擴展,是否有方法從模塊中調用方法?Ruby擴展調用模塊方法

class Dog 
    def initialize(name) 
    @name = name 
    end 
end 

module Speech 
    def say_name 
    puts @name 
    end 
    # call to method in module ? 
    say_name 
end 

fido = Dog.new('fido') 
fido.extend Speech => *'fido'* 

我知道的行爲有點像當包括模塊回調的「包括」方法的,但我希望爲延長類似的東西。

+1

*「我知道當包括模塊的行爲有點像一個回調‘包括’方法的,但我希望類似的擴展的東西。」 *你的意思是像['模塊#extended'(http://ruby-doc.org/core-2.2.0/Module.html#method-i-extended)? – engineersmnky

+0

是的......我想Module#extended是我在找的東西。這是我在閱讀文檔之前閱讀博客所獲得的內容。 – bkahler

回答

3

下面是使用方法extend_object的一個技巧。

通過將該模塊的常量方法(其被添加爲singleton方法)擴展指定的對象。這是Object#extend使用的回調方法。

class Dog 
    def initialize(name) 
    @name = name 
    end 
end 

module Speech 
    def Speech.extend_object(o) 
    super 
    puts o.say_name 
    end 

    def say_name 
    @name 
    end 
end 

fido = Dog.new('fido') 
fido.extend Speech # 'fido'