查看Ruby Under a Microscope的源代码
←
Ruby Under a Microscope
跳转到:
导航
、
搜索
因为以下原因,你没有权限编辑本页:
您刚才请求的操作只有这个用户组中的用户才能使用:
用户
您可以查看并复制此页面的源代码:
== 元编程 == * class 关键字,开启一个新的词法作用域。 * class 里 def 定义方法,三个步骤:编译代码指令、使用当前的词法作用域获取类或者模块的指针、在该类的方法表中保存新的方法。 * 类方法 def self.xxx 是定义在类的元类里,也就是 Quote.singleton_class。 * class << 类, 也是在元类定义方法,比之 self.xxx 主要是方便,<< 开启了一个新的词法作用域。 * def 对象.xxx,会为对象创建新的单类(singleton class),并为它指派新的方法。 * class << 对象与 def 对象.xxx 类似。 * Ruby 2.0 引入 refine ,可以在某个模块中不修改原始类的情况下重新定义它的方法: <pre> class Quote def display puts "The quick brown fox jumped over the lazy dog." end end module AllCaps refine Quote do def display puts "THE QUICK BROWN FOX JUMPED OVER THE LAZY DOG." end end end def test Quote.new.display using AllCaps Quote.new.display end Quote.new.display using AllCaps Quote.new.display test </pre> using 暂时不允许使用在顶级作用域。using 相当于在当前作用域激活了 refinement 模块,方法查找将从当前激活的 refinement 模块开始,没有找到才去调用原始方法。 * 词法作用域本质是是两个指针:nd_class 当前 class, nd_next 上一层作用域,可以通过 Module.nesting 来查看嵌套作用域。 * def 定义的方法都是当前的词法作用域的类上,也就是 self,顶层作用域定义的方法其实都是在 Object 类里。 * self 的规则: 在类或者模块的作用域内部,self 总是被设置为类或者模块。在方法内部(包括类方法),self 被设置为方法调用的接收者 receiver。 * eval 会创建闭包:编译代码和当前环境。 * self 是闭包的一部分, 对象的 instance_eval 体现了这一点。 * 对象 instance_eval 会创建新的词法作用域,并且设置 self 为对象的单类。 * define_method 和 def 的区别在于 define_method 会创建闭包,因此可以访问外层的环境,而 def 不行,所以用 define_method 来打破界限。
返回到
Ruby Under a Microscope
。
个人工具
登录
名字空间
页面
讨论
变换
查看
阅读
查看源代码
查看历史
操作
搜索
导航
首页
社区专页
新闻动态
最近更改
随机页面
帮助
工具箱
链入页面
相关更改
特殊页面