案例等式運算子()
也稱為三等於。
此運算子不測試相等性,而是測試右運算元是否與左運算元具有 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'