2015-06-29 90 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'