Ruby比较运算符?== 和 === 的区别是什么?

19

“==”和“===”有什么区别?在何时使用它们?


这个问题的答案非常扎实,可以在什么是equal?, eql?, ===,和==之间的区别?找到。 - Mark Amery
2个回答

38

两者都是在对象上调用的方法。这意味着对象决定什么意思。但是,在Ruby中有关于它们差异的约定。通常情况下, == === 更严格-如果a == b,那么 a === b 几乎总是为真的。阅读有关此内容的最佳位置是 http://ruby-doc.org/core/classes/Object.html 。向下滚动到有关 == === 的不同部分。以下是我知道的一些约定:

  • == 应用于普通 Object 时,只有在一个与另一个完全相同-如果它们存储在相同的内存位置(这是Ruby内部运作方式)。但是,如果参数不是Object类型,则通常会覆盖此方法。
  • equal?对于普通的 Object 来说,就像 == 一样,但永远不会被子类覆盖。
  • === 用于:
    • is_a?的替代品,向后。 String ==='str'为真。
    • 匹配正则表达式。 / s [at] r * / ==='str'为真。

您可以在这些类的文档中找到有关 === 的具体含义,例如, Range 版本在此处( include?的同义词): http://ruby-doc.org/core/classes/Range.html#M000691


1
一个很好的覆盖==的例子是字符串,这样它就能做你(可能)期望的事情。比较字符串字面量和指向“相同”字符串的变量的==.equal - Telemachus
1
哇!Ruby中的约定与JavaScript相反。不要让任何人感到困惑... - Alexis Wilke
只有我觉得右操作数是左操作数的实例很奇怪吗?还是因为我的经验不足? - Hiro

-5

== 用于条件语句中的相等判断,如 ifunless等。而===用于case语句中的确定相等性。


3
举个例子,10不等于1到20的所有数字,但它在这个范围内。因此,您可能希望能够将范围放在您的条件语句中,并对其进行选择。另外,请注意,在像case a when b then true end这样的语句中,条件语句会被翻译成b === a - Joshua Cheek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接