【发布时间】:2017-05-26 12:47:34
【问题描述】:
我对 Ruby 还是很陌生,似乎我仍然对 mixin 和在类中包含模块感到困惑。我希望能够访问类模块中定义的实例变量(@)。 我有以下代码:
module ModuleB
attr_reader :b
def ModuleB.initialize(browser)
puts "initialize from ModuleB"
@browser = browser
@b = 5
end
end
module ModuleA
attr_reader :a
include ModuleB
def ModuleA.initialize(browser)
ModuleB.initialize(browser)
puts "initialize from ModuleA"
@browser = browser
@a = @b
end
def action_1
@a = @b + 1
return @a
end
end
class ClassA
include ModuleA
def initialize(browser)
ModuleA.initialize(browser)
@browser = browser
puts 'initialize - method in ClassA'
@c = @a
@d = @b
puts "a = #{@a}"
puts "b = #{@b}"
puts "c = #{@c}"
puts "d = #{@d}"
end
end
s = 'hello'
instA = ClassA.new(s)
puts instA.action_1
这是我得到的输出:
initialize from ModuleB
initialize from ModuleA
initialize - method in ClassA
a =
b =
c =
d =
mixin_example2.rb:23:in `action_1': undefined method `+' for nil:NilClass (NoMethodError)
from mixin_example2.rb:46:in `<main>'
似乎@a 和@b 未初始化。
另外,我不能在action_1 方法中使用“+”运算符。
我错过了什么?
对不起,如果我重复了可能已经提出的问题,但到目前为止我没有找到答案。
【问题讨论】:
-
这看起来应该是继承模式而不是模块模式。使用继承让这更流畅更实用更明显
-
mixin 继承 is 继承。事实上,
include只是创建了一个类并将该类作为超类。 -
@engineersmnky,实际上我正在尝试做的(未在这段代码中显示)是使用模块获得多重继承。