为什么self.class === MyClass返回false,而self.class == MyClass返回true?

Zen*_*rou 9 ruby

我正在使用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语句中提供有意义的语义.

谁可以在那里揭示可能发生的事情?提前致谢.

mat*_*att 5

线索在"通常由后代覆盖以在case语句中提供有意义的语义",特别是Module覆盖它:

Case Equality - true如果objmod的一个实例或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)

(虽然我认为你的设计可能不太正确,但测试一个对象的类通常是代码味道.相反,你可能应该在对象中使用不同的方法实现.)