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)
)。