===如何在Ruby中工作?

问题描述:

我知道Class定义了===来测试一个对象是否是该类的一个实例。===如何在Ruby中工作?

现在的问题是为什么只有Class是左手操作数才会评估为true

实施例:

'a' === String #false 

String === 'a' #true 

def Foo 
end 

f = Foo.new 
f === Foo #false 
Foo === f #true 
+1

http://gilesbowkett.blogspot.com/2007/11/what-is-threequals.html。 TLDR:不要使用它。对于Class来说,它的定义是检查右侧是否是实例,但对于String来说,===被定义为检查是否相等。 – 2015-04-02 04:36:45

+2

你问这个问题的唯一原因是因为方法名称===和==相似。你会问为什么'3/2'与'2/3'不一样? 'String ==='abc''是'String。===('abc')'的snytactic糖。如果该方法被命名为'triple_equal',我们可以像这样使用它:'String.triple_equal('abc')'。你会问,如果这应该是相同的''abc'.triple_equal(String)'? – 2015-04-02 04:52:58

+0

@AmitKumarGupta,'...但是对于String,=== ...'有点混乱。我知道你指的是两个字符串的比较,但读者可能认为你的意思是'String ==='cat''。 – 2015-04-02 04:58:04

由于

  • String === 'a'String.===('a')相同,它调用Class#===,从Module#===继承来测试参数是否从接收模块继承;和

  • 'a' === String相同'a'.===(String),它调用String#===,从Object#===继承来测试参数是否等于接收器对象。

换句话说,===是不对称的; Object#===Module#===是非常不同的方法。还有Regexp#===,Proc#=== ......也做非常不同的事情,也是不对称的(匹配模式,用参数执行)。