“===”运算符在Ruby中做什么?

可能重复:
在Ruby中===与==

我已经看到它最近使用了几次,但不知道它做了什么。 谁能说明它是如何工作的?

就像Ruby中的其他方法一样(或者几乎任何面向对象的语言),

 a === b 

意味着class级的作者所希望的意思。

但是,如果你不想混淆你的同事,那么惯例是===就是包容操作符。 基本上,这是一个布尔运算符,它提出了这样的问题:“ 如果我有一个抽屉标签,将b放在抽屉里有意义吗?

另一种表述是“ 如果描述了一个集合,是否会是该集合的成员?

例如:

  (1..5) === 3 # => true (1..5) === 6 # => false Integer === 42 # => true Integer === 'fourtytwo' # => false /ell/ === 'Hello' # => true /ell/ === 'Foobar' # => false 

===运算符的主要用法是caseexpression式,因为

 case foo when bar baz when quux flurb else blarf end 

被翻译成某种东西(粗略地)

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

请注意,如果要search此运算符,通常称其为三重相等运算符三元运算符个案相等运算符 。 我真的不喜欢这些名字,因为这个操作符与平等完全没有任何关系。

特别是,人们会期望等式是对称的:如果a等于b ,那么b最好也等于a 。 此外,人们会期望相等是传递:如果a == bb == c ,然后a == c 。 虽然没有办法真正保证像Ruby这样的单一调度语言,但你至less应该努力保留这个属性(例如,遵循coerce协议)。

然而,对于===没有对称或传递性的期望。 事实上,它是非常对称的devise。 这就是为什么我不喜欢称之为甚至与平等相似的东西。 这也是为什么我认为,它应该被称为其他像~~~或其他什么。

感谢您的编辑雅各布,我正要打电话给你;)我会张贴几个例子无论如何。 ===的实现根据types的不同而不同。 例如:

 (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中, ===运算符用于在case语句的when子句中testing相等性。 在其他语言中,以上是真实的。

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