查看: 2413|回复: 4

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

[复制链接]
梦石
0
星屑
50
在线时间
1281 小时
注册时间
2006-8-27
回帖
550
发表于 2013-6-10 23:57:24 | 显示全部楼层 |阅读模式

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

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

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

object.PNG
图中 case 语句中 object != RPG::Weapon
梦石
0
星屑
54
在线时间
1208 小时
注册时间
2011-1-23
回帖
881

贵宾

发表于 2013-6-11 00:08:35 | 显示全部楼层
依照你这样的情况,还是优先选用if判定吧
if判定的自由度比case高,略复杂的判定就不要用case了
→→→牛排的小黑屋←←←
回复

使用道具 举报

梦石
0
星屑
50
在线时间
466 小时
注册时间
2013-2-8
回帖
420
发表于 2013-6-11 00:15:17 来自手机 | 显示全部楼层
本帖最后由 SuperMario 于 2013-6-11 00:21 编辑

加个.class

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

使用道具 举报

梦石
0
星屑
1580
在线时间
1564 小时
注册时间
2008-7-30
回帖
4207

贵宾

发表于 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?方法)换句话说:

[pre lang="ruby" line="1"]
1 === Fixnum
#=>false  1是Object而非Module, ===等同于==,而1显然不是Fixnum
Fixnum === 1
#=> true Fixnum是Class也是Module,1是Fixnum的实例,也就是Fixnum的后裔。
RPG::Weapon === RPG::Weapon
#=> false RPG::Weapon 不是 RPG::Weapon的实例及后裔![/pre]

其实你可以这样,涉及到类的时候你 cls/mod == obj 想做: obj.kind_of? cls/mod就可以了。
[pre lang="ruby" line="1"]
Class === Class
#=> true
#等效于Class.kind_of? Class

Class.ancestors
#=> [Class, Module, Object, Kernel, BasicObject]
#我们看下Class的继承关系,也就是它的祖先

Object == Class
#=>true
#等效于Class.kind_of? Object
# 因为我们观察到Object是Class的祖先,所以这个是成立的
#[/pre]

点评

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

评分

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

查看全部评分


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

使用道具 举报

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

使用道具 举报

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

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部