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

Project1

 找回密码
 注册会员
搜索

请问CASE语句的判定方式

查看数: 2012 | 评论数: 4 | 收藏 0
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2013-6-10 23:57

正文摘要:

本帖最后由 wbsy8241 于 2013-6-11 17:49 编辑 图中 case 语句中 object != RPG::Weapon

回复

认真的学 发表于 2013-6-11 09:19:25
case语句是以===而不是==判断的,而
  1. p obj === RPG::Weapon  #==>false
复制代码
所以没有执行when里面的p
DeathKing 发表于 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

查看全部评分

SuperMario 发表于 2013-6-11 00:15:17
本帖最后由 SuperMario 于 2013-6-11 00:21 编辑

加个.class

看错了,我还以为你实例化了。你这个直接给变量赋值类的用法,我没用过...
︶ㄣ牛排ぶ 发表于 2013-6-11 00:08:35
依照你这样的情况,还是优先选用if判定吧
if判定的自由度比case高,略复杂的判定就不要用case了
拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

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

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

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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