案例等式运算符()

也称为三等于

此运算符不测试相等性,而是测试右操作数是否与左操作数具有 IS A 关系 。因此,流行的名称案例相等运算符具有误导性。

这个 SO 答案如此描述:描述 a === b 的最佳方式是“如果我有一个标有 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 语句中提供有意义的语义。他们之中有一些是:

╔═════════════════╦════════════════════╗
║      Class      ║     Synonym for    ║
╠═════════════════╬════════════════════╣
║ Array           ║ ==                 ║
║                 ║                    ║
║ Date            ║ ==                 ║
║                 ║                    ║
║ Module          ║ is_a?              ║
║                 ║                    ║
║ Object          ║ ==                 ║
║                 ║                    ║
║ Range           ║ include?           ║
║                 ║                    ║
║ Regexp          ║ =~                 ║
║                 ║                    ║
║ String          ║ ==                 ║
╚═════════════════╩════════════════════╝

推荐做法

应避免明确使用案例相等运算符 ===。它不测试相等,而是测试包含 ,它的使用可能会令人困惑。当使用同义词方法时,代码更清晰,更容易理解。

# Bad
Integer === 42
(1..5) === 3
/ell/ === 'Hello'

# Good, uses synonym method
42.is_a?(Integer)
(1..5).include?(3)
/ell/ =~ 'Hello'