【发布时间】:2015-04-05 04:04:35
【问题描述】:
我知道 Class 定义了=== 来测试是否
一个对象就是那个类的一个实例。
现在的问题是,为什么只有当 Class 是左手操作数时才会计算为 true。
示例:
'a' === String #false
和
String === 'a' #true
或
def Foo
end
f = Foo.new
f === Foo #false
Foo === f #true
【问题讨论】:
-
gilesbowkett.blogspot.com/2007/11/what-is-threequals.html。 TLDR:不要使用它。没错,对于 Class,它被定义为检查右侧是否为实例,但对于 String,=== 被定义为检查相等性。
-
您问这个问题的唯一原因是因为方法名称
===和==彼此相似。你会问为什么3 / 2和2 / 3不一样吗?String === 'abc'是String.===('abc')的语法糖。如果将该方法命名为triple_equal,我们将像这样使用它:String.triple_equal('abc')。请问是否应该和'abc'.triple_equal(String)一样? -
@AmitKumarGupta,
...but for String, ===...有点令人困惑。我知道您指的是两个字符串的比较,但读者可能会认为您的意思是String === 'cat'。 -
@JörgWMittag 很自然地期望类似相等的方法是自反的、对称的 和传递的。如果不是这样,那是 语言 是例外和反传统的,而不是 程序员的期望。
-
假设 OP 知道
===首先是用于案例归并,但如果 OP 知道他不会问这个问题。我的评论是关于“类似于平等”的方法。这显然是OP混乱的根源。对这个问题的回答不是,“你不知道案例包容是如何工作的吗?”,而是“我明白你为什么感到困惑,这个看起来与平等有关的东西实际上是为了某种东西否则,有时与相等 (==) 相吻合。"
标签: ruby