How to dynamically define a class method which will refer to a local variable outside?

前端 未结 3 1198
有刺的猬
有刺的猬 2021-02-02 09:27
class C
end

var = \"I am a local var outside\"

C.class_eval do
   def self.a_class_method
     puts var 
   end
end

I know, this is not correct, beca

相关标签:
3条回答
  • 2021-02-02 09:44

    Class methods don't really exist in Ruby, they are just singleton methods of the class object. Singleton methods don't really exist, either, they are just ordinary instance methods of the object's singleton class.

    Since you already know how to define instance methods (using Module#define_method), you already know everything you need to know. You just need to call class_eval on C's singleton class instead of C itself:

    (class << C; self end).class_eval do
      define_method(:a_class_method) do
        puts var 
      end
    end
    

    Current versions of Ruby have a singleton_class method to make that easier:

    C.singleton_class.class_eval do
      define_method(:a_class_method) do
        puts var 
      end
    end
    

    But actually, current versions of Ruby also have Module#define_singleton_method, so, in this particular case, that is unnecessary:

    C.define_singleton_method(:a_class_method) do
      puts var 
    end
    
    0 讨论(0)
  • 2021-02-02 10:03

    you can do it simply this way

    class << C
      define_method(:a_class_method) do
         # do something
      end
    end
    
    0 讨论(0)
  • 2021-02-02 10:05
    C.instance_eval do
      def class_method
        "This is class method"
      end
    end
    

    instance_eval: defines singleton methods on the object (which results in class methods when it's called on class object).

    class_eval: defines regular instance methods

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