Ruby比较运算符? == 与 === [重复]
Posted
技术标签:
【中文标题】Ruby比较运算符? == 与 === [重复]【英文标题】:Ruby comparison operators? == vs. === [duplicate] 【发布时间】:2011-03-10 10:51:15 【问题描述】:== 和 === 有什么区别?什么时候应该使用哪个?
【问题讨论】:
What's the difference between equal?, eql?, ===, and ==? 有一个非常可靠的答案 【参考方案1】:两者都只是在对象上调用的方法。这意味着对象决定哪个意味着什么。然而,Ruby 中有一些关于它们有何不同的约定。通常,==
比 ===
更严格 - 如果a == b
是,a === b
将几乎始终为真。阅读此内容的最佳地点是http://ruby-doc.org/core/classes/Object.html。向下滚动到关于==
和===
的不同部分。以下是我知道的一些约定:
==
,当应用于普通的Object
s 时,只有在一个与另一个完全相同的情况下才会为真 - 如果它们存储在相同的内存位置(这就是 Ruby 在内部的工作方式)。但是,如果参数的类型不是 Object,则通常会覆盖此方法。
equal?
就像 ==
用于普通的 Object
s,但永远不会被子类覆盖。
===
用于:
is_a?
替代,倒退。 String === 'str'
是真的。
匹配正则表达式。 /s[at]r*/ === 'str'
是真的。
您可以在这些类的文档中找到===
对于各种类的具体含义,例如Range
版本在这里(include?
的同义词):http://ruby-doc.org/core/classes/Range.html#M000691
【讨论】:
一个很好的覆盖==
的例子,以便它执行您(可能)期望的是字符串。比较 ==
和 .equal
的字符串文字和指向“相同”字符串的变量。
哇!与 javascript 相比,Ruby 中的约定是相反的。不要混淆任何人......
只有我觉得右操作数是左操作数的实例很奇怪吗?只是我缺乏经验?【参考方案2】:
==
用于if
、unless
等条件语句中的相等性。===
用于确定case
语句中的相等性。
【讨论】:
例如,10 不等于 1..20,但在那个范围内。因此,您可能希望能够将范围放在您的案例陈述中,并选择它。另外,请注意 case 语句在case a when b then true end
等语句中转换为 b===a以上是关于Ruby比较运算符? == 与 === [重复]的主要内容,如果未能解决你的问题,请参考以下文章