【问题标题】:How to dynamically define a class method which will refer to a local variable outside?如何动态定义将引用外部局部变量的类方法?
【发布时间】:2011-03-30 01:56:03
【问题描述】:
class C
end

var = "I am a local var outside"

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

我知道,这是不正确的,因为 def 创建了一个新范围。 我也知道使用define_method可以创建实例方法而不创建新的作用域,但我的重点是如何定义一个类方法

【问题讨论】:

    标签: ruby dynamic closures class-method local-variables


    【解决方案1】:

    类方法在 Ruby 中并不真正存在,它们只是类对象的单例方法。单例方法也不存在,它们只是对象单例类的普通实例方法。

    由于您已经知道如何定义实例方法(使用Module#define_method),因此您已经知道了您需要知道的一切。你只需要在C 的单例类上调用class_eval 而不是C 本身:

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

    当前版本的 Ruby 有一个 singleton_class 方法来简化此操作:

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

    但实际上,当前版本的 Ruby 也有 Module#define_singleton_method,因此,在这种特殊情况下,这是不必要的:

    C.define_singleton_method(:a_class_method) do
      puts var 
    end
    

    【讨论】:

    • 很好的答案。您能否分享指向 ruby​​ 关于类方法元编程的文档的链接?谢谢
    • @mattgathu:Ruby 中没有类方法。方法只有一种:实例方法。
    • 我正在尝试实现一个带参数的单例方法。我该怎么做?
    • @mattgathu:Ruby 中不存在单例方法。单例方法只是在单例类中定义的普通实例方法。定义带参数的单例方法与定义带参数的实例方法完全相同,因为只有实例方法。单例方法和类方法没什么特别的,因为它们不存在
    • 很好的解释!如果可以的话,我会多次投票 XD
    【解决方案2】:

    这样就可以了

    class << C
      define_method(:a_class_method) do
         # do something
      end
    end
    

    【讨论】:

      【解决方案3】:
      C.instance_eval do
        def class_method
          "This is class method"
        end
      end
      

      instance_eval:在对象上定义单例方法(在类对象上调用时会产生类方法)。

      class_eval:定义常规实例方法

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-10-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-09
        • 1970-01-01
        相关资源
        最近更新 更多