Ana*_*and 5 ruby inheritance module
在Ruby中,我正在尝试创建一个类,它基于初始化期间给出的值将继承以下模块之一.我想创建一个基本模块,这些模块继承自包含常用方法的基本模块,这些方法使用继承它的模块中定义的常量.例:
module BaseMod
def what_am_i
puts OUTPUT
end
end
module Tall
OUTPUT = "I am tall"
include BaseMod
end
module Short
OUTPUT = "I am short"
include BaseMod
end
class Person
def initialize type
if type =~ /short/i
extend Short
else
extend Tall
end
end
end
p = Person.new "short"
p.what_am_i
Run Code Online (Sandbox Code Playgroud)
我的问题是,当调用"p.what_am_i"时,我收到以下错误:
NameError: uninitialized constant BaseMod::OUTPUT
const_missing at org/jruby/RubyModule.java:2642
what_am_i at test_logic2.rb:3
(root) at test_logic2.rb:28
Run Code Online (Sandbox Code Playgroud)
我也想知道是否有更好的方法来做这件事.
为了在你的情况下得到常数,你必须写这样的东西:
module Tall
::OUTPUT = "I am tall"
include BaseMod
end
Run Code Online (Sandbox Code Playgroud)
但请注意,您正在使用 Short 模块的声明重新定义 Constant。为此,你总是会得到“我很矮”。
因此,要正确执行此操作,您应该尝试:
module BaseMod
OUTPUT="Before"
def what_am_i
puts OUTPUT
end
end
module Tall
def self.extended(k)
OUTPUT.replace "I am tall"
end
include BaseMod
end
module Short
def self.extended(k)
OUTPUT.replace "I am short"
end
include BaseMod
end
Run Code Online (Sandbox Code Playgroud)
K