假设我有以下代码.
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
差异看起来不是很多,但是这意味着左侧的===方法被调用,而不是在语言层面上定义的一些魔术运算符,就像==但不完全相同.相反,===在每个使用它的类中定义,也许在一个继承的类或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语句中确定正确的方式.