Ruby动态模块混合

Ruby动态模块混合,ruby,mixins,Ruby,Mixins,假设我有两个模块: module Test1 attr_accessor :a, :b @a = 0.0 @b = 0.0 end module Test2 attr_accessor :c, :d @c = 0.0 @d = 0.0 end 现在,我想有条件地将这些模块混合到一个类中。这就是我尝试过的: require './Test1.rb' require './Test2.rb' class MyClass def initialize(m

假设我有两个模块:

module Test1

  attr_accessor :a, :b

  @a = 0.0
  @b = 0.0

end

module Test2

  attr_accessor :c, :d

  @c = 0.0
  @d = 0.0

end
现在,我想有条件地将这些模块混合到一个类中。这就是我尝试过的:

require './Test1.rb'
require './Test2.rb'

class MyClass

  def initialize(mode)
    if mode == 0
      (class << self; include Test1; end)
    elsif mode == 1
      (class << self; include Test2; end)
    else
      class << self
        include Test1
        include Test2
      end
    end
  end

end

在类中的实例方法中,
@a
也是
nil
。我觉得我在这里没有理解一些重要的事情。我想了解为什么我所做的不起作用,以及实现所需功能的正确方法是什么。

您有这种行为,因为您在模块中设置的这些实例变量属于模块本身,而不是属于
MyClass
实例。考虑这个代码:

Test1.instance_variable_get(:@a)
# => 0.0
要解决此问题,可以使用
extend
而不是
include

module Test1

  attr_accessor :a, :b

  def self.extended(object)
    object.a, object.b = 0.0, 0.0
  end

end

module Test2

  attr_accessor :c, :d

  def self.extended(object)
    object.c, object.d = 0.0, 0.0
  end

end
在你们班上:

require './Test1.rb'
require './Test2.rb'

class MyClass

  def initialize(mode)
    if mode == 0
      extend Test1
    elsif mode == 1
      extend Test2
    else
      extend Test1
      extend Test2
    end
  end

end

我想了一个解决这个问题的方法,所以我想和大家分享一下。我还是想看看是否有人知道一个更好的方法来实现我的目标

Module Test1
  attr_accessor :a, :b

  def init1
    @a = 0.0
    @b = 0.0
  end
end

class MyClass
  def initialize
    if mode == 0
      (class << self; include Test1; end)
      init1
    elsif mode == 1
      ...
  end
end
模块测试1
属性存取器:a,:b
DEFINIT1
@a=0.0
@b=0.0
结束
结束
类MyClass
def初始化
如果模式==0

(课堂完美,这正是我想要的。谢谢!
Module Test1
  attr_accessor :a, :b

  def init1
    @a = 0.0
    @b = 0.0
  end
end

class MyClass
  def initialize
    if mode == 0
      (class << self; include Test1; end)
      init1
    elsif mode == 1
      ...
  end
end