红宝石三倍相等

时间:2011-04-11 04:58:49

标签: ruby

假设我有以下代码。

result = if a.is_a?(Class) && a <= Exception
   a.name
elsif ...
elsif ...
end

我将此代码重构为

case a
when Exception
     a.name
when ...
when ...
end

我是否理解三重正确?

2 个答案:

答案 0 :(得分:56)

我们无法从这样一个有限的例子中判断你是否真的得到了===。但是,当你使用===时,或者作为case / when语句的一部分(例如示例中使用的语句)显式或隐式地分解了实际发生的事情。

三重等号(===)有许多不同的实现,它们依赖于左侧部分的类。它实际上只是。===方法的中缀表示法。意味着以下陈述是相同的:

a.=== b
a === b

差异看起来并不多,但这意味着左手边的===方法被调用而不是在语言层面上定义的某个神奇算子,就像==但不完全。相反,===在每个使用它的类中定义,可能在继承的类或Mixin中。

三重等于的一般定义是,如果两个部分相同或右边部分包含在左边的范围内,它将返回true。

对于Class。===,如果参数是类(或子类)的实例,则操作将返回true。在左侧是正则表达式的情况下,当右侧与正则表达式匹配时,它返回true。

case的时间是隐含的===,它使用===将case变量与when子句进行比较,以便以下两个语句产生相同的结果。

case a
when String
  puts "This is a String"
when (1..3)
  puts "A number between 1 and 3"
else
  puts "Unknown"
end

if String === a 
  puts "This is a String"
elsif (1..3) === a
  puts "A number between 1 and 3"
else
  puts "Unknown"
end

检查文档,了解您在===或when语句左侧使用的类型,以确定具体如何。

答案 1 :(得分:2)

我相信在您的第一个示例中,您正在检查a 是否Exception的子类(如果我错了,请更正我)。第二个示例只检查aException的实例(相当于a.is_a?(Exception))。