设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
楼主: zh99998
打印 上一主题 下一主题

[已经解决] ===的判定求解

 关闭 [复制链接]

Lv2.观梦者 (管理员)

八云紫的式神

梦石
0
星屑
619
在线时间
1243 小时
注册时间
2008-1-1
帖子
4282

烫烫烫

11
 楼主| 发表于 2009-7-21 17:18:48 | 只看该作者
Fix本来就不是Fix的实例
但是,看5楼
rm for linux(wine)制作中,期待夏娜SAMA能实现到webrm上
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
21 小时
注册时间
2007-7-3
帖子
573
12
发表于 2009-7-21 17:33:20 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
238 小时
注册时间
2006-10-2
帖子
417
13
发表于 2009-7-21 17:37:28 | 只看该作者
本帖最后由 猫哥哥 于 2009-7-21 17:41 编辑
Fix本来就不是Fix的实例
但是,看5楼
zh99998 发表于 2009-7-21 17:18


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

但是可以肯定case...when不是拿equal?这种判断值的形式来做判断的……{:3_50:}
"equal?"和"=="、"eql?"不一样……"equal?"会同时检查值和内存地址。"=="只检查值。"eql?"检查值和类型。
回复 支持 反对

使用道具 举报

Lv2.观梦者 (管理员)

八云紫的式神

梦石
0
星屑
619
在线时间
1243 小时
注册时间
2008-1-1
帖子
4282

烫烫烫

14
 楼主| 发表于 2009-7-21 17:40:47 | 只看该作者
没有明白5楼是什么意思。

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

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


13楼的,p出的值是不同的,但是我还是不明白===的作用
rm for linux(wine)制作中,期待夏娜SAMA能实现到webrm上
回复 支持 反对

使用道具 举报

Lv3.寻梦者

孤独守望

梦石
0
星屑
3137
在线时间
1535 小时
注册时间
2006-10-16
帖子
4321

开拓者贵宾

15
发表于 2009-7-21 17:42:27 | 只看该作者
本帖最后由 IamI 于 2009-7-22 07:57 编辑

错错错,全错- -
菩提本非树,明镜本非台。回头自望路漫漫。不求姻缘,但求再见。
本来无一物,何处惹尘埃。风打浪吹雨不来。荒庭遍野,扶摇难接。
不知道多久更新一次的博客
回复 支持 反对

使用道具 举报

Lv2.观梦者 (管理员)

八云紫的式神

梦石
0
星屑
619
在线时间
1243 小时
注册时间
2008-1-1
帖子
4282

烫烫烫

16
 楼主| 发表于 2009-7-21 17:45:20 | 只看该作者
多谢提醒,现在问题可以比较清晰的表述了

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

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

这是因为后面的必须是Module
rm for linux(wine)制作中,期待夏娜SAMA能实现到webrm上
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
21 小时
注册时间
2007-7-3
帖子
573
17
发表于 2009-7-21 17:52:31 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复 支持 反对

使用道具 举报

Lv2.观梦者 (管理员)

八云紫的式神

梦石
0
星屑
619
在线时间
1243 小时
注册时间
2008-1-1
帖子
4282

烫烫烫

18
 楼主| 发表于 2009-7-22 07:02:42 | 只看该作者
这样只解释出了为什么
Fixnum === Fixnum #=>false
但是没有解释出为什么
1 === 1 #=>true
rm for linux(wine)制作中,期待夏娜SAMA能实现到webrm上
回复 支持 反对

使用道具 举报

Lv3.寻梦者

孤独守望

梦石
0
星屑
3137
在线时间
1535 小时
注册时间
2006-10-16
帖子
4321

开拓者贵宾

19
发表于 2009-7-22 08:04:32 | 只看该作者
昨天终于明白了……长篇大论写好了但是懒得发,简单概括:
1.is_a?(Module) => false
Fixnum.is_a?(Module) => true
参考Module和Object当中定义的===方法,
无需多言了吧。
另外zh我不觉得这和解释器有什么关系……

那啥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

如有问题,欢迎反驳~
菩提本非树,明镜本非台。回头自望路漫漫。不求姻缘,但求再见。
本来无一物,何处惹尘埃。风打浪吹雨不来。荒庭遍野,扶摇难接。
不知道多久更新一次的博客
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
21 小时
注册时间
2007-7-3
帖子
573
20
发表于 2009-7-24 16:32:14 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2025-1-11 19:41

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表