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/
Its probably worth noting that you don't need to include modules into a metaclass.
class NonInstantiableClass
Const = "hello, world!"
class << self
include CommonMethods
end
end
Ruby has the extend
keyword that effectively adds the modules interface to a class, e.g.
class NonInstantiableClass
Const = "hello, world!"
extend CommonMethods
end
You still need to ensure you're referencing the right constant using self::Const
or const_get
, but extend <module>
is the better way to add those methods to the class.
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
The problem is, if you just write Const
it is evaluated on Module creation time. You have to use Module#const_get
instead like this: const_get(:Const)
. This is evaluated at runtime when the method is executed. So this happens in your class and not in your module.