lazybios

《Ruby 元编程》读书笔记(六)

Ruby元编程

类的返回值

像方法一样,类定义也会返回最后一条语句的值:

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]

class_eval方法

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的选择

通常使用instance_eval方法打开非类的对象,而用class_eval方法打开类定义,然后用def定义方法。

-待续-

微信关注「日拱一卒」公众号