Подтвердить что ты не робот

В Ruby существует способ "переопределить" константу в подклассе, чтобы унаследованные методы использовали новую константу вместо старой?

В 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 и, похоже, работает, за исключением того, что методы класса не могут получить доступ к 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>'
4b9b3361

Ответ 1

Я сделал это, просто переопределив константу в подклассе, а затем ссылаясь на нее в методах 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!"