我正在使用Ruby的case语法来设置一些基于self.class如下的简单逻辑:
case self.class
when FirstClass
do stuff....
when SecondClass
do other stuff...
end
Run Code Online (Sandbox Code Playgroud)
我很快意识到这总是回归nil.经过仔细调查,我发现case使用===而不是==检查平等.当self.class == FirstClass我在我的终端中运行时,我得到true了预期,但self.class === FirstClass返回false.
展望红宝石文档,我发现了以下的解释的===:
Case Equality - 对于Object类,实际上与调用#==相同,但通常由后代重写,以在case语句中提供有意义的语义.
谁可以在那里揭示可能发生的事情?提前致谢.
线索在"通常由后代覆盖以在case语句中提供有意义的语义",特别是Module覆盖它:
Case Equality -
true如果obj是mod的一个实例或mod的后代之一,则返回.模块的用途有限,但可以在case语句中用于按类对对象进行分类.
因此对于模块而言,其===行为非常类似于is_a?方法(实际上它只是在MRI Ruby中调用相同的实现函数rb_obj_is_kind_of).在您的示例中,它的计算结果是false因为self.class它不是.的实例FirstClass.它可能只是一个实例Class.self但是可能只是一个例子:
case self
when FirstClass
do stuff....
when SecondClass
do other stuff...
end
Run Code Online (Sandbox Code Playgroud)
(虽然我认为你的设计可能不太正确,但测试一个对象的类通常是代码味道.相反,你可能应该在对象中使用不同的方法实现.)
| 归档时间: |
|
| 查看次数: |
163 次 |
| 最近记录: |