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

lazybios · 2015年09月13日 · 最后由 lazybios 回复于 2016年06月26日 · 3085 次阅读

博客地址 :《Ruby 元编程》读书笔记 (六)

相关文章:

《Ruby 元编程》读书笔记 (一) 《Ruby 元编程》读书笔记 (二) 《Ruby 元编程》读书笔记 (三) 《Ruby 元编程》读书笔记 (四) 《Ruby 元编程》读书笔记 (五)

传神的头图↓↓↓

Ruby元编程

类的返回值

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

result = class MyClass
    self
end
result #=> MyClass

当前类

与当前对象 self 一样,同时还存在当前类(或模块)

Ruby 中并没有类似当前对象 self 一样的明确引用,不过在追踪当前类的时候,可以遵循下面几条:

  • 在程序顶层,当前类是 Object,这是 main 对象所属的类。
  • 在一个方法中,当前类就是当前对象的类。(在一个方法中用 def 关键字定义另一个方法,新定义的方法会定义在 self 所属的类中。因为 Ruby 解释器总是追踪当前类 (或模块) 的引用,所以使用 def 定义的方法都成为当前类的实例方法了)

示例代码

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 关键字打开一个类时 (或 module 关键字打开模块),那个类称为当前类。

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 定义方法。

-待续-

=============== 最后贴一下自己的公众账号

可以十日不将军,不可一日不拱卒,日拱一卒 (rigongyizu365)

支持楼主,继续更新,伸手党在这。。。。。。。

#1 楼 @tommylike 嗯 多谢关注 会持续更新的 😄

保持阵型,支持楼主!

lazybios 《Ruby 元编程》读书笔记 (十六)[连载完结] 提及了此话题。 06月26日 10:50
lazybios 《Ruby 元编程》读书笔记 (七) 提及了此话题。 06月26日 10:50
lazybios 《Ruby 元编程》读书笔记 (八) 提及了此话题。 06月26日 10:50
lazybios 《Ruby 元编程》读书笔记 (九) 提及了此话题。 06月26日 10:50
lazybios 《Ruby 元编程》读书笔记 (十) 提及了此话题。 06月26日 10:50
lazybios 《Ruby 元编程》读书笔记 (十一) 提及了此话题。 06月26日 10:50
lazybios 《Ruby 元编程》读书笔记 (十二) 提及了此话题。 06月26日 10:50
lazybios 《Ruby 元编程》读书笔记 (十三) 提及了此话题。 06月26日 10:50
lazybios 《Ruby 元编程》读书笔记 (十四) 提及了此话题。 06月26日 10:50
lazybios 《Ruby 元编程》读书笔记 (十五) 提及了此话题。 06月26日 10:50
需要 登录 后方可回复, 如果你还没有账号请 注册新账号