在Ruby模块中继承常量

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)

我也想知道是否有更好的方法来做这件事.

kwi*_*her 2

为了在你的情况下得到常数,你必须写这样的东西:

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