假设我有以下代码。
result = if a.is_a?(Class) && a <= Exception
a.name
elsif ...
elsif ...
end
我将此代码重构为
case a
when Exception
a.name
when ...
when ...
end
我是否理解三重正确?
答案 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
的子类(如果我错了,请更正我)。第二个示例只检查a
是Exception
的实例(相当于a.is_a?(Exception)
)。