2011-04-11 32 views
11

假设我有以下代码。ruby​​ triple equal

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

我重构此代码

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

难道我理解三重等于正确?

+2

@Chuck:在Ruby中,case语句的含义是隐含的===。 – EmFi 2011-04-11 05:30:19

+0

您是否阅读过“模块#===”的文档? – 2011-04-11 05:53:17

+0

我有一个相关的问题:http://stackoverflow.com/questions/3757818/ruby-when-keyword-does-not-use-in-case-statement-what-does-it-use – 2011-04-11 07:32:04

回答

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语句中的文档,以确定事情是如何解决的。

+0

感谢您的详细解答。 – 2011-04-11 19:36:56

2

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