Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Override ruby constant in subclass so inherited methods use new constant instead of the old?

Tags:

ruby

In Ruby, is there a way to 'override' a constant in a subclass in such a way that calling an inherited method from the subclass results in that method using the new constant instead of the old one? For example:

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!" 

If not, is there perhaps a way to do something like this instead?

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!" 

Note: I tried my second example out in irb, and it seems to work except that class methods can't seem to access CONST after I clone the class:

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>' 
like image 359
Ajedi32 Avatar asked Nov 05 '12 14:11

Ajedi32


1 Answers

I've done this by simply redefining the constant in the subclass, and then referring to it in methods as self.class::CONST in instance methods and self::CONST in class methods. In your example:

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!" 
like image 58
Zach Kemp Avatar answered Sep 20 '22 13:09

Zach Kemp