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

Project1

 找回密码
 注册会员
搜索
查看: 2011|回复: 4
打印 上一主题 下一主题

[已经解决] 请问CASE语句的判定方式

[复制链接]

Lv1.梦旅人

梦石
0
星屑
50
在线时间
1281 小时
注册时间
2006-8-27
帖子
590
跳转到指定楼层
1
发表于 2013-6-10 23:57:24 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
本帖最后由 wbsy8241 于 2013-6-11 17:49 编辑


图中 case 语句中 object != RPG::Weapon

Lv1.梦旅人

梦石
0
星屑
54
在线时间
1208 小时
注册时间
2011-1-23
帖子
910

贵宾

2
发表于 2013-6-11 00:08:35 | 只看该作者
依照你这样的情况,还是优先选用if判定吧
if判定的自由度比case高,略复杂的判定就不要用case了
→→→牛排的小黑屋←←←
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
466 小时
注册时间
2013-2-8
帖子
424
3
发表于 2013-6-11 00:15:17 手机端发表。 | 只看该作者
本帖最后由 SuperMario 于 2013-6-11 00:21 编辑

加个.class

看错了,我还以为你实例化了。你这个直接给变量赋值类的用法,我没用过...
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1180
在线时间
1564 小时
注册时间
2008-7-30
帖子
4418

贵宾

4
发表于 2013-6-11 09:19:00 | 只看该作者
你似乎理解错case的用法了。case使用的是===做判断,而非==。要理解清楚这个问题,你首先需要知道“===”只是个“方法”。对于不同的类,它们对===有了不同的定义,也就会有不同的行为。对于普通对象(Object)来说 === 就是 == (请参见http://ruby-doc.org/core-1.9.3/Object.html)而对于Module,这个操作符被重载了。它的行为有点不一样。我还是来具体说一下吧。

obj === other → true or false
Case Equality—For class Object, effectively the same as calling #==, but typically overridden by descendants to provide meaningful semantics in case statements.


我简单翻译一下:

obj === other 返回true或者false
用于case语句时的比较,对于Object类来说,===的行为和==是一致的,但这个通常被子类(后裔)覆盖,以便在case语句中提供更有意义的语义。


这里面提到了===会被重载的问题,实际上,Module类就覆盖了===这个方法。在Module类里面,===用于判断指定参数是否为mod的后裔(有点像kind_of?方法)换句话说:

RUBY 代码复制
  1. 1 === Fixnum
  2. #=>false  1是Object而非Module, ===等同于==,而1显然不是Fixnum
  3. Fixnum === 1
  4. #=> true Fixnum是Class也是Module,1是Fixnum的实例,也就是Fixnum的后裔。
  5. RPG::Weapon === RPG::Weapon
  6. #=> false RPG::Weapon 不是 RPG::Weapon的实例及后裔!


其实你可以这样,涉及到类的时候你 cls/mod == obj 想做: obj.kind_of? cls/mod就可以了。
RUBY 代码复制
  1. Class === Class
  2. #=> true
  3. #等效于Class.kind_of? Class
  4.  
  5. Class.ancestors
  6. #=> [Class, Module, Object, Kernel, BasicObject]
  7. #我们看下Class的继承关系,也就是它的祖先
  8.  
  9. Object == Class
  10. #=>true
  11. #等效于Class.kind_of? Object
  12. # 因为我们观察到Object是Class的祖先,所以这个是成立的
  13. #

点评

哦,我知道了.我转成字符串比较好了.  发表于 2013-6-11 17:47

评分

参与人数 2星屑 +60 梦石 +1 收起 理由
Sion + 1 感谢帮忙
wbsy8241 + 60

查看全部评分


See FScript Here:https://github.com/DeathKing/fscript
潜心编写URG3中。
所有对URG3的疑问和勘误或者建议,请移步至发布页面。
欢迎萌妹纸催更
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
55
在线时间
869 小时
注册时间
2009-3-13
帖子
782
5
发表于 2013-6-11 09:19:25 | 只看该作者
case语句是以===而不是==判断的,而
  1. p obj === RPG::Weapon  #==>false
复制代码
所以没有执行when里面的p
我的寒假活动作品:http://rpg.blue/forum.php?mod=viewthread&tid=281065
咱的龙蛋,求点击:
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-18 14:37

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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