在Ruby中,有没有一种方法可以"重写"子类中的常量,从而从该子类调用继承的方法,导致该方法使用新常量而不是旧常量?例如:

class SuperClass
  CONST = "Hello, world!"
  def self.say_hello
    CONST
  end
end

class SubClass < SuperClass
  override_const :CONST, "Hello, Bob!"
end

SuperClass.say_hello # => "Hello, world!"
SubClass.say_hello   # => "Hello, Bob!"

如果没有,有没有办法改成这样?

class SuperClass
  CONST = "Hello, world!"
  def self.say_hello
    CONST
  end
end

SubClass = SuperClass.clone
SubClass.send(:remove_const, :CONST)
SubClass.const_set(:CONST, "Hello, Bob!")

SubClass.say_hello # => "Hello, Bob!"

注意:我在irb中try 了我的第二个示例,它似乎有效,只是在我克隆类之后,类方法似乎无法访问CONST:

irb(main):012:0> SubClass.say_hello
NameError: uninitialized constant Class::CONST
        from (irb):4:in `say_hello'
        from (irb):12
        from C:/Ruby193/bin/irb:12:in `<main>'

推荐答案

我只是在子类中重新定义常量,然后在方法中将其称为self.class::CONST个实例方法和self::CONST个类方法.在你的例子中:

class SuperClass
  CONST = "Hello, world!"
  def self.say_hello
    self::CONST
  end
end

class SubClass < SuperClass
  CONST = "Hello, Bob!"
end

SubClass.say_hello #=> "Hello, Bob!"

Ruby相关问答推荐

运行跳过的RSpec测试,如果通过则失败

CarrierWave Multi-uploader重命名现有文件

Ruby 中的 Float#floor 和 Float#to_i 有什么区别?

这是按引用传递/值传递的误解,导致此方法无法按预期输出吗?

使用 Ruby 仅删除数组中的特定重复项

VS Code Prettier 打破哈希访问

Ruby符号前面的-是什么意思?

将数组转换为哈希,其中键是索引

Sinatra 与 EventMachine WebSockets 一起工作是否成功?

在ruby中反转数组的顺序

如何修改 Ruby gem

Ruby:通过正则表达式过滤数组?

Ruby gem 权限被拒绝 /var/lib/gems 使用 Ubuntu

Ruby中的每个块都可以有一行吗?

如何在 Ruby 中找到除法的余数?

如何通过反射获得活动记录关联

Mustache Templates 可以做模板扩展吗?

Ruby 疯狂:类与对象?

遍历数组的前 n 个元素

带有类名的动态类定义