===如何在Ruby中工作?
问题描述:
我知道Class定义了===
来测试一个对象是否是该类的一个实例。===如何在Ruby中工作?
现在的问题是为什么只有Class
是左手操作数才会评估为true
。
实施例:
'a' === String #false
和
String === 'a' #true
或
def Foo
end
f = Foo.new
f === Foo #false
Foo === f #true
答
由于
String === 'a'
与String.===('a')
相同,它调用Class#===
,从Module#===
继承来测试参数是否从接收模块继承;和'a' === String
相同'a'.===(String)
,它调用String#===
,从Object#===
继承来测试参数是否等于接收器对象。
换句话说,===
是不对称的; Object#===
和Module#===
是非常不同的方法。还有Regexp#===
,Proc#===
......也做非常不同的事情,也是不对称的(匹配模式,用参数执行)。
http://gilesbowkett.blogspot.com/2007/11/what-is-threequals.html。 TLDR:不要使用它。对于Class来说,它的定义是检查右侧是否是实例,但对于String来说,===被定义为检查是否相等。 – 2015-04-02 04:36:45
你问这个问题的唯一原因是因为方法名称===和==相似。你会问为什么'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
@AmitKumarGupta,'...但是对于String,=== ...'有点混乱。我知道你指的是两个字符串的比较,但读者可能认为你的意思是'String ==='cat''。 – 2015-04-02 04:58:04