Cro*_*lio 23 ruby closures dynamic local-variables class-method
class C
end
var = "I am a local var outside"
C.class_eval do
def self.a_class_method
puts var
end
end
Run Code Online (Sandbox Code Playgroud)
我知道,这是不正确的,因为def创建了一个新的范围.我也知道use define_method可以在不创建新范围的情况下创建实例方法,但我的观点是如何定义类方法.
Jör*_*tag 55
类方法在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
Run Code Online (Sandbox Code Playgroud)
当前版本的Ruby有一种singleton_class方法可以使这更容易:
C.singleton_class.class_eval do
define_method(:a_class_method) do
puts var
end
end
Run Code Online (Sandbox Code Playgroud)
但实际上,当前版本的Ruby也有Module#define_singleton_method,因此,在这种特殊情况下,这是不必要的:
C.define_singleton_method(:a_class_method) do
puts var
end
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
11683 次 |
| 最近记录: |