没有明白5楼是什么意思。
但是可以肯定case...when不是拿equal?来做判断的
"equal?"和"=="、"eql?"不一样……"equal?"会同时检查值和内存地址。"=="只检查值。"eql?"检查值和类型。 ...
猫哥哥 发表于 2009-7-21 17:37
本来打算发帖的……所以都留了代码,
原文:
啊对不起……上面我说的全部推翻= =
昨天晚上测试了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的===方法,也就是==方法。
为什么?请看[I]所有类都是Class类的子类[/I](偷瞄zh)复制代码
- p Fixnum.is_a?(Class)
- p 1.is_a?(Class)
照此分析得:
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
如有问题,欢迎反驳~
欢迎光临 Project1 (https://rpg.blue/) | Powered by Discuz! X3.1 |