【问题标题】:Ruby Invoking Module Method On Extend扩展上的 Ruby 调用模块方法
【发布时间】:2015-06-29 19:13:29
【问题描述】:

给定一个基本的 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 有类似的东西。” 你意思是像Module#extended?
  • 是的...我猜 Module#extended 是我正在寻找的。这就是我在阅读文档之前阅读博客所得到的。

标签: ruby module


【解决方案1】:

这是使用extend_object方法的一个技巧。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-10
    • 1970-01-01
    • 2013-07-23
    相关资源
    最近更新 更多