加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

在Ruby模块中继承常量

发布时间:2020-12-17 03:30:27 所属栏目:百科 来源:网络整理
导读:在 Ruby中,我正在尝试创建一个类,它基于初始化期间给出的值将继承以下模块之一.我想创建一个基本模块,这些模块继承自包含常用方法的基本模块,这些方法使用继承它的模块中定义的常量.例: module BaseMod def what_am_i puts OUTPUT endendmodule Tall OUTPUT
在 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

我的问题是,当调用“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

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

解决方法

module BaseMod
  def what_am_i
    puts self.class::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
      self.class.send(:include,Short)
    else
      self.class.send(:include,Tall)
    end
  end
end

p = Person.new "short"
p.what_am_i

编辑:上面的代码实际上不起作用:

p = Person.new "short"
p.what_am_i
>> I am short
p = Person.new "tall"
p.what_am_i
>> I am tall
p = Person.new "short"
p.what_am_i
>> I am tall

这是另一种尝试:

module BaseMod
  def self.included(base)
    base.send(:define_method,:what_am_i) do
      puts base::OUTPUT
    end
  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
p = Person.new "tall"
p.what_am_i
p = Person.new "short"
p.what_am_i

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读