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

时间:2010-12-17 03:55:16

标签: ruby

  

可能重复:
  === vs. == in Ruby

我看到它最近使用了几次但却无法弄清楚它的作用。任何人都可以说明它是如何工作的吗?

3 个答案:

答案 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 == bb == 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 ++中的运算符重载)。