如何动态定义一个类方法来引用外部的局部变量?
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 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, 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.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
Ruby 中并不真正存在类方法,它们只是类对象的单例方法。单例方法也不真正存在,它们只是对象单例类的普通实例方法。
由于您已经知道如何定义实例方法(使用
Module#define_method
),因此您已经知道需要了解的所有内容。您只需要在C
的单例类上调用class_eval
而不是C
本身:当前版本的 Ruby 有一个
singleton_class 方法使这变得更容易:
但实际上,当前版本的 Ruby 也有
Module#define_singleton_method
,因此,在这种特殊情况下,这是不必要的: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 callclass_eval
onC
's singleton class instead ofC
itself:Current versions of Ruby have a
singleton_class
method to make that easier:But actually, current versions of Ruby also have
Module#define_singleton_method
, so, in this particular case, that is unnecessary:你可以简单地这样做
you can do it simply this way
instance_eval:定义对象上的单例方法(在类对象上调用时会生成类方法)。
class_eval:定义常规实例方法
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