class C
end
var = "I am a local var outside"
C.class_eval do
def self.a_class_method
puts var
end
end
我知道,这是不正确的,因为def
创建了一个新的范围。我也知道 usedefine_method
可以在不创建新作用域的情况下创建实例方法,但我的观点是如何定义类方法。
class C
end
var = "I am a local var outside"
C.class_eval do
def self.a_class_method
puts var
end
end
我知道,这是不正确的,因为def
创建了一个新的范围。我也知道 usedefine_method
可以在不创建新作用域的情况下创建实例方法,但我的观点是如何定义类方法。
类方法在 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
你可以这样做
class << C
define_method(:a_class_method) do
# do something
end
end
C.instance_eval do
def class_method
"This is class method"
end
end
instance_eval:在对象上定义单例方法(在类对象上调用时会产生类方法)。
class_eval:定义常规实例方法