查看Ruby元编程技术的源代码
←
Ruby元编程技术
跳转到:
导航
、
搜索
因为以下原因,你没有权限编辑本页:
您刚才请求的操作只有这个用户组中的用户才能使用:
用户
您可以查看并复制此页面的源代码:
{{版权声明}} == 简介 == 读《Ruby元编程》的笔记 == Open Class == class更像是作用域操作符,而不仅是类型声明语句。随时可以打开一个class定义或者覆写方法: #为String添加新方法 class String def to_alphanumeric self.gsub /^[\w\s]/, "" end end == 对象模型 == * 对象由一组实例变量和一个类的引用组成。 * 对象的方法存在与对象所属的类中(从类的的角度来看,它们叫做实例方法) * 类本身是Class类的对象。类的名字不过是一个常量而已 * Class类是Module的子类。一个模块基本上是由一组方法组成的包。类除了具有模版的特性之外,还可以被实例化(通过new方法)以及本组织为层次结构(通过superClass方法) * 常量像文件系统一样,是按照树形结构组织的。其中模块和类的名字扮演目录的角色,其他普通的常量则扮演文件的角色 * 每个类都有一个祖先链,这个链从自己所属的类开始,向上直到BasicObject类结束 * 当调用一个方法时,Ruby首先向右一步来到接受者所属的类,然后一直向上查找祖先链,直到找到该方法,或者到达链的顶端为止 * 每当一个类包含一个模块时,该模块会被插入在祖先链中,位置在该类的正上方 * 当调用一个方法时,接收者会扮演self的角色 * 当定义一个模块时(或者类)时,该模块扮演self的角色 * 实例变量永远被认定为self的实例变量 * 任何没有明确指定接收者的方法调用,都当成调用self方法 module M1 end module M2 end module M3 end class A include M1 end class B < A include M2 include M3 end B.ancestors => [B,M3,M2,A,M1,Object,Kernel,BasicObject] [[文件:Ruby_object_model.png]] == 内核方法 == 通过给Kernel增加方法来为所有对象增加方法。 == 动态方法 == * 动态派发,利用send或者public_send(1.9加入)来动态调用函数 * 动态定义方法,使用define_method来动态定义方法 == Method Missing == * method_missing包含在kernel模块中,默认抛出无法找到方法的error * 对象可以复写method_missing来动态响应方法调用,思考下,这其实就是消息传递。 * 用途: ** 幽灵方法:用来响应不曾明确的方法 ** 动态代理: 例如为web service创建本地动态代理 ** * delegate标准库,委托模式 * const_missing方法,用于常量 * 注意事项: ** 避免无限循环,适当调用super来终止循环。 ** 最好在一个白板对象上使用幽灵方法,避免重名,如何得到一个白板对象?使用undef_method方法来移除所有方法,或者继承BasicObject(Ruby 1.9)。 ** 适当定义respond_to?来响应幽灵方法。 class Computer instance_methods.each do | m | undef_method m unless m.to_s =~ / ^__ | method_missing | respond_to?/ end def method_missing(name,*args) ...... end end
该页面使用的模板:
模板:版权声明
(
查看源代码
)
返回到
Ruby元编程技术
。
个人工具
登录
名字空间
页面
讨论
变换
查看
阅读
查看源代码
查看历史
操作
搜索
导航
首页
社区专页
新闻动态
最近更改
随机页面
帮助
工具箱
链入页面
相关更改
特殊页面