ruby三倍相等

假设我有以下代码。

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

我重构了这段代码

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

我是否正确理解三重相等?

我们无法从这样一个有限的例子中判断你是否真的得到了===。 但是,当您使用===时,显式或隐式地将这些内容作为case / when语句(如示例中使用的语句)的一部分进行分解。

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

 a.=== b a === b 

差异看起来并不多,但它的意思是左侧的===方法被调用而不是在语言级别定义的某个魔法运算符,就像==但不完全。 相反,===在每个使用它的类中定义,可能在inheritance的类或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语句左侧使用的类型,以确定具体如何。

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