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

后端 未结 3 1434
星月不相逢
星月不相逢 2021-02-20 00:32

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/         


        
相关标签:
3条回答
  • 2021-02-20 00:36

    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.

    0 讨论(0)
  • 2021-02-20 00:41

    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

    0 讨论(0)
  • 2021-02-20 00:47

    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.

    0 讨论(0)
提交回复
热议问题