如何动态扩展类上的模块?

时间:2019-02-05 13:31:21

标签: ruby

我目前有两个类,每个类都扩展了一个不同的模块:

class Example1
  def initialize
    extend TopModule:SubModule1
  end
end

class Example2
  def initialize
    extend TopModule:SubModule2
  end
end

不是每个类都扩展了两个类,而是可以创建一个类,然后在对象级别扩展该模块?

我已经添加了模块的名称,并将其传递给对象的构造函数,但抱怨代码。

class Example
  def initialize (module)
    self.send("extend TopModule::#{module}"
  end
end

object = Example.new('Submodule1')

NoMethodError:
  undefined method `extend TopModule::SubModule1' for #<Example:0x00000000057c8198>

总体问题:假设我有N个对象(它们都应来自同一类,但每个对象必须具有自己的模块)。具有此功能的最佳方法是什么?

2 个答案:

答案 0 :(得分:4)

更新后的答案!

module TopModule
  module SubModule1
    def hello
      puts "Hello from #1"
    end
  end
end

module TopModule
  module SubModule2
    def hello
      puts "Hello from #2"
    end
  end
end

class Example
  def initialize(mod)
    extend TopModule.const_get(mod)
  end
end

Example.new("SubModule1").hello
# => Hello from #1
Example.new("SubModule2").hello
# => Hello from #2

答案 1 :(得分:0)

您可能走错了路,这迫使您找到“不良”解决方案。 But here it is.

class Example
  def initialize m
    self.instance_eval("extend Topmodule::#{m}")
  end
end