Project1

标题: 请问CASE语句的判定方式 [打印本页]

作者: wbsy8241    时间: 2013-6-10 23:57
标题: 请问CASE语句的判定方式
本帖最后由 wbsy8241 于 2013-6-11 17:49 编辑


图中 case 语句中 object != RPG::Weapon
作者: ︶ㄣ牛排ぶ    时间: 2013-6-11 00:08
依照你这样的情况,还是优先选用if判定吧
if判定的自由度比case高,略复杂的判定就不要用case了
作者: SuperMario    时间: 2013-6-11 00:15
本帖最后由 SuperMario 于 2013-6-11 00:21 编辑

加个.class

看错了,我还以为你实例化了。你这个直接给变量赋值类的用法,我没用过...
作者: DeathKing    时间: 2013-6-11 09:19
你似乎理解错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 09:19
case语句是以===而不是==判断的,而
  1. p obj === RPG::Weapon  #==>false
复制代码
所以没有执行when里面的p




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