赞 | 23 |
VIP | 207 |
好人卡 | 31 |
积分 | 31 |
经验 | 48797 |
最后登录 | 2024-11-30 |
在线时间 | 1535 小时 |
Lv3.寻梦者 孤独守望
- 梦石
- 0
- 星屑
- 3137
- 在线时间
- 1535 小时
- 注册时间
- 2006-10-16
- 帖子
- 4321
|
昨天终于明白了……长篇大论写好了但是懒得发,简单概括:
1.is_a?(Module) => false
Fixnum.is_a?(Module) => true
参考Module和Object当中定义的===方法,
无需多言了吧。
另外zh我不觉得这和解释器有什么关系……
那啥II我把这个记录贴上来研究一下了,在聊天记录看着不爽
本来打算发帖的……所以都留了代码,
原文:
啊对不起……上面我说的全部推翻= =
昨天晚上测试了1个小时得出的结论如下:
测试脚本:
- class Module
- alias really ===
- def ===(obj)
- p "I'm called! By Class","self:" + self.inspect,"obj:" + obj.inspect
- really(obj)
- end
- end
- class Object
- alias real ===
- def ===(obj)
- p "I'm called! By Object","self:" + self.inspect,"obj:" + obj.inspect
- real(obj)
- end
- end
- p Fixnum === 1
- p 1 === Fixnum
- p Fixnum === Fixnum
- p 1 === 1
- exit
复制代码 所得结论如下:
Module的===等价于kind_of(但是左右操作数似乎相反)
Object的===等价于==
如果===的左操作对象是Module以及其子类,[B]是类而不是对象的[/B]
(左操作对象诸如:Class,Fixnum,String,Bitmap等等)
那么调用Module的===方法,也就是kind_of方法。
如果===的左操作对象不是Module或其子类,也就是说[B]是对象而不是类[/B]的
(左操作对象诸如:1(Fixnum的对象),"ABCD"(String的对象),nil(NilClass的对象))
那么调用Object的===方法,也就是==方法。
为什么?请看
- p Fixnum.is_a?(Class)
- p 1.is_a?(Class)
复制代码 [I]所有类都是Class类的子类[/I](偷瞄zh)
照此分析得:
Fixnum === 1,Fixnum是类,调用Module#===,即1.is_a?(Fixnum),得true
1 === Fixnum,1是对象,调用Object#===,即1 == Fixnum,得false
Fixnum === Fixnum => Fixnum.is_a?(Fixnum) => true
1 === 1 => 1 == 1 => true
如有问题,欢迎反驳~ |
|