Search code examples
rubyclassmoduleconstantsclass-method

(In Ruby) allowing mixed-in class methods access to class constants


I have a class with a constant defined for it. I then have a class method defined that accesses that class constant. This works fine. An example:

#! /usr/bin/env ruby

class NonInstantiableClass
    Const = "hello, world!"
    class << self
        def shout_my_constant
            puts Const.upcase
            end
        end
    end

NonInstantiableClass.shout_my_constant

My problem arises in attempting to move this class method out to an external module, like so:

#! /usr/bin/env ruby

module CommonMethods
    def shout_my_constant
        puts Const.upcase
        end
    end

class NonInstantiableClass
    Const = "hello, world!"
    class << self
        include CommonMethods
        end
    end

NonInstantiableClass.shout_my_constant

Ruby interprets the method as requesting a constant from the module, rather than the class:

line 5:in `shout_my_constant': uninitialized constant CommonMethods::Const (NameError)

So, what magic tricks do you fellows have to let the method access the class constant? Many thanks.


Solution

  • This seems to work:

    #! /usr/bin/env ruby
    
    module CommonMethods
        def shout_my_constant
            puts self::Const.upcase
        end
    end
    
    class NonInstantiableClass
        Const = "hello, world!"
        class << self
            include CommonMethods
        end
    end
    
    NonInstantiableClass.shout_my_constant
    

    HTH