“===”运算符在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
===
运算符的主要用法是case
expression式,因为
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 == b
和b == 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 ++中的运算符重载)。