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 中并不真正存在类方法,它们只是类对象的单例方法。单例方法也不真正存在,它们只是对象单例类的普通实例方法。
因为您已经知道如何定义实例方法(使用Module#define_method
),您已经知道了您需要知道的一切。你只需要打电话class_eval
on C
的单例类而不是C
itself:
(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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)