"==="运算符在Ruby中做了什么?

ste*_*och 109 ruby

可能重复:
在Ruby中=== vs. ==

我看到它最近使用了几次但却无法弄清楚它的作用.谁能说明它是如何工作的?

Jör*_*tag 259

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

a === b
Run Code Online (Sandbox Code Playgroud)

意味着无论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
Run Code Online (Sandbox Code Playgroud)

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

case foo
when bar
  baz
when quux
  flurb
else
  blarf
end
Run Code Online (Sandbox Code Playgroud)

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

_temp = foo

if bar === _temp
  baz
elsif quux === _temp
  flurb
else
  blarf
end
Run Code Online (Sandbox Code Playgroud)

请注意,如果要搜索此运算符,通常将其称为三重等于运算符三元运算符大小写等于运算符.我真的不喜欢这些名字,因为这个运算符绝对没有任何与平等有关的东西.

特别是,人们会期望相等是对称的:如果a等于b,那么b最好也等于a.此外,人们所期望的平等是传递的:如果a == bb == c,然后a == c.虽然没有办法真正保证在像Ruby的单牒的语言,你至少应该作出努力,保持这种特性(例如,通过下面的coerce协议).

但是,因为===没有对称性或传递性的期望.事实上,它非常依赖于设计而不是对称的.这就是为什么我不喜欢叫它什么,甚至远程类似于平等.这也是为什么我认为它应该被称为其他类似的~~~东西.

  • 我喜欢你与套装的比较,它有助于使这个"操作员"最有意义. (13认同)
  • 哇!鉴于有关此问题的最佳答案来自您,您必须对***包含***运算符有最好的理解.这让我很困惑,所以谢谢:) (2认同)
  • 不对称的例子:`符号===:符号#=> true``:符号===符号#=> false` (2认同)
  • 什么是案例supsumption techincal定义?我没有多说这个词.你的意思是身份运营商? (2认同)
  • 顺便说一下,`===`也不是反身:`String === String#=> false`所以它没有任何[均衡所需的3个基本属性](https://en.wikipedia.组织/维基/ Reflexive_relation). (2认同)

小智 6

感谢您的编辑雅各布,我打算叫你出去;)无论如何,我会发布一些例子.===的实现因类型而异.例如:

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

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

case 'test'
when /blah/
  "Blach"
when /test/
  "Test"
else
  "Fail"
end
=> "Test"
Run Code Online (Sandbox Code Playgroud)

斯蒂芬,结帐http://ruby-doc.org/docs/ProgrammingRuby/("镐头"),它应该能够在将来帮助你解决这个问题.

  • @Jacob Relkin,确定它是一个真正的运算符,它不是像*==那样的*一致*运算符,因为正在测试的内容可能会根据对象而改变.[见答案](http://stackoverflow.com/questions/3422223/vs-in-ruby/3422349#3422349)@JörgWMittag在上一个问题中给出了答案. (2认同)