Project1

标题: ===的判定求解 [打印本页]

作者: zh99998    时间: 2009-7-21 16:08
标题: ===的判定求解
p Fixnum===Fixnum #=>false
p 1 === 1 #=>true
求解释
作者: 死亡之龙    时间: 2009-7-21 16:09
提示: 作者被禁止或删除 内容自动屏蔽
作者: zh99998    时间: 2009-7-21 16:23
另:IamI大人提供的实验结果
p Fixnum === Object #=>false
p Object === Fixnum #=>true
p Object === Object #=>true
作者: 冰蓝的马甲    时间: 2009-7-21 16:23
p 1 === Fixnum #=> false
p Fixnum === 1 #=> true
p Fixnum === Fixnum #=> false

那么还是Object#kind_of?这个

解释:
Fixnum是一的实例 错误
1是Fixnum的实例 正确
Fixnum是Fixnum的实例 错误
完毕
作者: zh99998    时间: 2009-7-21 16:26
如果照这样说的话,上面那四个结果都能解释的通
但是常用的case匹配数字之类的东西的时候就不对劲了……
var = 1
case var
when 1
***
when 2
***
end
1肯定不是1的实例但是照样能匹配啊

难道说是kind_of?和equal?有一个真就返回真??
作者: 猫哥哥    时间: 2009-7-21 16:40
没有记错的话,“===”应该是个正则表达式的运算符。

和赋值运算符“=”还有条件运算符“==”根本不是一回事,囧
作者: zh99998    时间: 2009-7-21 16:41
===跟正则又有啥关系了……
作者: 猫哥哥    时间: 2009-7-21 16:48
只是依稀记得,两年前看的programming ruby了……
反正记得=~是正则的运算符,===在列出的ruby符号表里挨得比较近,所以我一直以为也是正则的运算符……
作者: 死亡之龙    时间: 2009-7-21 16:49
提示: 作者被禁止或删除 内容自动屏蔽
作者: ONEWateR    时间: 2009-7-21 17:07
http://osdir.com/ml/ruby-talk/2009-05/msg00850.html
囧,懂英文的自然好~

从译文来看 Fixnum不是Fixnum的实例
作者: zh99998    时间: 2009-7-21 17:18
Fix本来就不是Fix的实例
但是,看5楼
作者: goahead    时间: 2009-7-21 17:33
提示: 作者被禁止或删除 内容自动屏蔽
作者: 猫哥哥    时间: 2009-7-21 17:37
本帖最后由 猫哥哥 于 2009-7-21 17:41 编辑
Fix本来就不是Fix的实例
但是,看5楼
zh99998 发表于 2009-7-21 17:18


没有明白5楼是什么意思。

但是可以肯定case...when不是拿equal?这种判断值的形式来做判断的……{:3_50:}
"equal?"和"=="、"eql?"不一样……"equal?"会同时检查值和内存地址。"=="只检查值。"eql?"检查值和类型。
作者: zh99998    时间: 2009-7-21 17:40
没有明白5楼是什么意思。

但是可以肯定case...when不是拿equal?来做判断的
"equal?"和"=="、"eql?"不一样……"equal?"会同时检查值和内存地址。"=="只检查值。"eql?"检查值和类型。 ...
猫哥哥 发表于 2009-7-21 17:37

5楼的意思是说,如果4楼的解释是对的,也就是===是用来判断父类子类,那么平时使用的case数字就会出现问题


13楼的,p出的值是不同的,但是我还是不明白===的作用
作者: IamI    时间: 2009-7-21 17:42
本帖最后由 IamI 于 2009-7-22 07:57 编辑

错错错,全错- -
作者: zh99998    时间: 2009-7-21 17:45
多谢提醒,现在问题可以比较清晰的表述了

问题更新为解释===的作用
1 === 1 #=>true
Fixnum === Fixnum #=>false

尝试1.is_a?(1)出错IamI 发表于 2009-7-21 17:42

这是因为后面的必须是Module
作者: goahead    时间: 2009-7-21 17:52
提示: 作者被禁止或删除 内容自动屏蔽
作者: zh99998    时间: 2009-7-22 07:02
这样只解释出了为什么
Fixnum === Fixnum #=>false
但是没有解释出为什么
1 === 1 #=>true
作者: IamI    时间: 2009-7-22 08:04
昨天终于明白了……长篇大论写好了但是懒得发,简单概括:
1.is_a?(Module) => false
Fixnum.is_a?(Module) => true
参考Module和Object当中定义的===方法,
无需多言了吧。
另外zh我不觉得这和解释器有什么关系……
[line]1[/line]那啥II我把这个记录贴上来研究一下了,在聊天记录看着不爽
本来打算发帖的……所以都留了代码,
原文:
啊对不起……上面我说的全部推翻= =
昨天晚上测试了1个小时得出的结论如下:
测试脚本:

  1. class Module
  2.   alias really ===
  3.   def ===(obj)
  4.     p "I'm called! By Class","self:" + self.inspect,"obj:" + obj.inspect
  5.     really(obj)
  6.   end  
  7. end
  8. class Object
  9.   alias real ===
  10.   def ===(obj)
  11.     p "I'm called! By Object","self:" + self.inspect,"obj:" + obj.inspect
  12.     real(obj)
  13.   end  
  14. end
  15. p Fixnum === 1
  16. p 1 === Fixnum
  17. p Fixnum === Fixnum
  18. p 1 === 1
  19. 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的===方法,也就是==方法。
为什么?请看

  1. p Fixnum.is_a?(Class)
  2. 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

如有问题,欢迎反驳~

作者: goahead    时间: 2009-7-24 16:32
提示: 作者被禁止或删除 内容自动屏蔽
作者: zh99998    时间: 2009-7-24 16:34
明白了,解决,谢谢楼上几位




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1