What does the "===" operator do in Ruby?

Possible Duplicate:
=== vs. == in Ruby

I've seen it used a few times lately but can't figure out what it does. Can anyone illustrate how it works?

60978 次浏览

在 Ruby 中,===操作符用于测试 case语句的 when子句内的相等性。在其他语言中,上述观点是正确的。

据我所知,Ruby 没有 真正的操作者,它们都是 方法,在表达式的 LHS 上调用,传递表达式的 RHS。 所以,实际上,你可以在你的类中覆盖任何你想要的“操作符”来执行任何你想要的操作(类似于 C + + 中的运算符重载)。

感谢您的编辑雅各布,我正要叫你出来;)我会张贴一对夫妇的例子无论如何。= = 的实现根据类型的不同而不同。例如:

(1...3) === 2
=> true


/test/ === "this is a test"
=> true


case 'test'
when /blah/
"Blach"
when /test/
"Test"
else
"Fail"
end
=> "Test"

斯蒂芬,检查 http://ruby-doc.org/docs/ProgrammingRuby/(“镐”) ,它应该能够帮助你出这样的问题在未来。

就像 Ruby 中的其他方法(或者实际上几乎所有面向对象语言)一样,

a === b

意味着 a类的作者希望它是什么意思。

但是,如果您不想让您的同事感到困惑,惯例是 ===个案包括情况操作符。基本上,它是一个布尔运算符,问问题“ 如果我有一个标有 ABC1的抽屉,把 b放在那个抽屉里有意义吗?

另一种配方是“ 如果 ABC0描述了一个集合,那么 b是该集合的成员吗?

例如:

 (1..5) === 3           # => true
(1..5) === 6           # => false


Integer === 42          # => true
Integer === 'fourtytwo' # => false


/ell/ === 'Hello'     # => true
/ell/ === 'Foobar'    # => false

===运算符的主要用法是在 case表达式中,因为

case foo
when bar
baz
when quux
flurb
else
blarf
end

被翻译成类似于

_temp = foo


if bar === _temp
baz
elsif quux === _temp
flurb
else
blarf
end

注意,如果要搜索这个操作符,它通常被称为 三重等于运算符三等运算符大小写相等运算符。我真的不喜欢这些名字,因为这个运算符和等式完全没有任何关系。

特别是,我们希望等式是对称的: 如果 a等于 b,那么 b最好也等于 a。另外,我们可以期望等式是可传递的: 如果 a == bb == c,那么 a == c。虽然在像 Ruby 这样的单分派语言中,实际上没有办法实现 保证,但是您至少应该努力保留这个属性(例如,通过遵循 coerce协议)。

然而,对于 ===来说,不存在对称性或传递性的期望。事实上,它很大程度上是通过设计 没有对称的。这就是为什么我不喜欢称它为甚至 远程控制类似于等式的任何东西。这也是为什么我认为,它应该被称为像 ~~~或什么别的东西。