赞 | 2 |
VIP | 143 |
好人卡 | 1 |
积分 | 1 |
经验 | 216792 |
最后登录 | 2019-10-10 |
在线时间 | 24 小时 |
Lv1.梦旅人
- 梦石
- 0
- 星屑
- 61
- 在线时间
- 24 小时
- 注册时间
- 2008-8-5
- 帖子
- 1924
|
由于在不远的(希望...)将来, RGE 2.0 会嵌入 Ruby 1.9 作为脚本语言,它解决了很多 1.8 潜在的性能问题(当然,由于多出来的很多新东西,比如枚举器,也在某些方面降低了性能),我认为在这里讨论一下 1.9 的新东西也是有意义的。
Ruby 1.9 的类继承图表根部不再是 Object,而是一个叫 BasicObject 的类。为什么需要这个类?须知 Object 虽然处在底层,但也是捆绑了大量方法的庞然大物,它包含了在 Kernel 中定义的所有基本对象的实例方法。我们有时可能希望使用一个货真价实的“老子”,没有从任何人那里继承任何东西,以节省对象虚表所占据的空间,这就是 BasicObject 被引入的主要目的。它只包含了仅有的几个基本方法,没有包含克隆、污染、安全、冻结、反射、动态求值等五花八门的对象功能。- p BasicObject.instance_methods(false)
复制代码 这一行是打印出所有 BasicObject 定义的实例方法,输出:
[:==, :equal?, :!, :!=, :instance_eval, :instance_exec, :__send__]
而如果我们:- p Object.instance_methods(true)
复制代码 则输出:- [:nil?, :===, :=~, :!~, :eql?, :class, :clone, :dup, :taint, :tainted?, :untaint, :untrust, :untrusted?, :trust, :freeze, :frozen?, :to_s, :inspect, :methods, :singleton_methods, :protected_methods, :private_methods, :public_methods, :instance_variables, :instance_variable_get, :instance_variable_set, :instance_variable_defined?, :instance_of?, :kind_of?, :is_a?, :tap, :send, :public_send, :respond_to?, :extend, :display, :method, :public_method, :define_singleton_method, :hash, :__id__, :object_id, :to_enum, :enum_for, :gem, :==, :equal?, :!, :!=, :instance_eval, :instance_exec, :__send__]
复制代码 可见差距。后面之所以传递了一个 true,是为了同时输出从父类继承过来的方法,因为 Object 多出来的这些方法来自 Kernel Mix-in(换言之,这些方法本身定义在 Kernel 中),所以实际上 Object 有一个匿名父类,存在于 Object 和 BasicObject 之间。
在 Ruby 1.8 中,我们可以通过 undef 去实现这样的一个 BlankSlate (白板)类:- class BlankSlate
- instance_methods.each { |m| undef_method m }
- end
- p BlankSlate.instance_methods
复制代码 当然,有些方法你还是想保留的,比如 object_id、__send__(实际上如果你 undef 了这两个最基本的方法,Ruby 解释器会给你警告:
warning: undefining `object_id' may cause serious problem
warning: undefining `__send__' may cause serious problem
但是这仍然是一种亡羊补牢的做法。我们希望从一开始就有这样的“白板”,于是就有了 BasicObject。 |
|