Ruby调用扩展模块方法

4

在给定一个基本的 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'*

我知道“included”方法可以在模块包含时充当回调函数的作用,但我希望类似于“extend”的功能。

1
我知道'included'方法的作用类似于回调函数,当一个模块被包含时会触发,但我希望有类似于extend的东西。你是指像Module#extended这样的吗? - engineersmnky
是的...我想Module#extended就是我要找的。这就是在阅读文档之前先阅读博客的后果。 - bkahler
1个回答

3

这里有一个使用方法的技巧extend_object

通过添加此模块的常量方法(作为单例方法添加)来扩展指定的对象。这是由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'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接