如何动态定义将在外部引用局部变量的类方法? [英] How to dynamically define a class method which will refer to a local variable outside?

查看:63
本文介绍了如何动态定义将在外部引用局部变量的类方法?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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可以创建实例方法而无需创建新的作用域,但是我的意思是如何定义 class方法.

I know, this is not correct, because the def created a new scope. I also know that use define_method can create a instance method without creating a new scope, but my point is how to define a class method.

推荐答案

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

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.

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

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

当前的Ruby版本具有singleton_class方法,以使其变得更容易:

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

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

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

这篇关于如何动态定义将在外部引用局部变量的类方法?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆