赞 | 2 |
VIP | 143 |
好人卡 | 1 |
积分 | 1 |
经验 | 216792 |
最后登录 | 2019-10-10 |
在线时间 | 24 小时 |
Lv1.梦旅人
- 梦石
- 0
- 星屑
- 61
- 在线时间
- 24 小时
- 注册时间
- 2008-8-5
- 帖子
- 1924
|
case 语句可以用来做对象运行时类型的分歧:
- #coding: GBK
- foo = rand >= 0.5 ? 'foo' : :foo
- case foo
- when String
- p '字符串'
- when Symbol
- p '符号'
- end
复制代码 但经过测试后,你会发现 `foo == String || foo == Symbol' 从来都是 false。实际上,case 在判断相等性时使用的是 `===',而不是 `=='。如果并不了解这个事实,你可能会在使用 case 的时候习惯性、显式地去引用 `foo' 的类型:
- case foo.class
- when String
- # ...
- when Symbol
- # ...
- end
复制代码 接着你就会发现,这段 case 没有产生预期的效果。
这是因为 Class 覆盖了基类 Object#=== 方法,而 Class#===(obj) 返回的是 `self == obj.class'。case 语句会让 when 后面的对象成为接收者,并发送调用 `===' 方法的消息给它,类似 `String === foo' 的形式。这个表达式展开其实就是 `String == foo.class',所以起到了预期的判断效果。正因如此,`String === String' 这样的表达式反而会返回 false。,而这和在 case 后面引用 foo 的类型是一个道理,因为 foo.class = { String, Symbols }。 |
评分
-
查看全部评分
|