如何动态定义一个类方法,它将引用外部的局部变量?

时间:2010-08-15 12:47:39

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

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可以在不创建新范围的情况下创建实例方法,但我的观点是如何定义类方法

3 个答案:

答案 0 :(得分:51)

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

由于您已经知道如何定义实例方法(使用Module#define_method),因此您已经知道了所有需要知道的事情。您只需在class_eval的单例类上调用C而不是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

答案 1 :(得分:1)

你可以这样做

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

答案 2 :(得分:0)

C.instance_eval do
  def class_method
    "This is class method"
  end
end

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

class_eval :定义常规实例方法