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