可能重复:
=== vs. == in Ruby
我看到它最近使用了几次但却无法弄清楚它的作用。任何人都可以说明它是如何工作的吗?
答案 0 :(得分:251)
就像Ruby中的所有其他方法(或实际上几乎任何面向对象的语言)一样,
a === b
表示a
班级的作者想要表达的意思。
但是,如果您不想混淆同事,那么惯例是===
是案例包含运算符。基本上,它是一个布尔运算符,它询问问题“如果我有一个标有a
的抽屉,将b
放入抽屉中是否有意义?”
另一种表述是“如果a
描述了一个集合,那么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 == b
和b == c
,那么a == c
。虽然没有办法实际保证在像Ruby这样的单一调度语言中,你至少应该努力保留这个属性(例如,通过遵循coerce
协议)
然而,对于===
,没有对称性或传递性的期望。实际上,它非常依赖于设计而不是对称。这就是为什么我不喜欢称之为远程类似于平等的东西。这也是为什么我认为它应该被称为~~~
或其他任何东西。
答案 1 :(得分:6)
感谢您编辑雅各布,我正要打电话给您;)无论如何,我会发布几个例子。 ===的实现因类型而异。例如:
(1...3) === 2
=> true
/test/ === "this is a test"
=> true
case 'test'
when /blah/
"Blach"
when /test/
"Test"
else
"Fail"
end
=> "Test"
Stephen,结帐http://ruby-doc.org/docs/ProgrammingRuby/(“蠢货”),它应该可以帮助你解决此类问题。
答案 2 :(得分:3)
在Ruby中,===
运算符用于测试when
语句的case
子句内的相等性。在其他语言中,上述情况属实。
据我所知,Ruby没有 true运算符,它们都是方法,它们在表达式的LHS上调用,传入表达式的RHS 。 所以,实际上,您可以覆盖类中所需的任何“运算符”,以执行您想要的任何操作(类似于C ++中的运算符重载)。