像方法一样,类定义也会返回最后一条语句的值:
result = class MyClass
self
end
result #=> MyClass
与当前对象self一样,同时还存在当前类(或模块)
Ruby中并没有类似当前对象self一样的明确引用,不过在追踪当前类的时候,可以遵循下面几条:
class C
def m1
def m2; end
end
end
class D < C; end
obj = D.new
obj.m1
C.instance_methods(false) #=> [:m1, :m2]
Module#class_eval方法(别名: module_eval),会在一个已存在的类的上下文中执行一个块。使用该方法可以在不需要class关键字的前提下,打开类。
Module#class_eval与Object#instance_eval方法相比,后者instance_eval方法只能修改self,而class_eval方法可以同时修改self与当前类。
此外class_eval的另一个优势就是可以利用扁平作用域,规避class关键字的作用域门问题。
通常使用instance_eval方法打开非类的对象,而用class_eval方法打开类定义,然后用def定义方法。
-待续-