[英]Why does Ruby have no !== operator?
Ruby中的所有相等都是“嚴格的”,類似於PHP中的===
嗎? 我注意到Ruby中有一個===
運算符,但它做了不同的事情。
===
不是一個相等運算符!
不。
但是,它是什么?
您可能熟悉===
作為Javascript和PHP中的相等運算符,但這不是Ruby中的相等運算符,並且與其他語言具有根本不同的語義。
那么===
做什么?
===
是模式匹配運算符!
===
匹配正則表達式 ===
檢查范圍成員資格 ===
檢查是一個類的實例 ===
調用lambda表達式 ===
有時檢查平等,但大多數情況下都沒有 那么這種瘋狂是如何有意義的呢?
Enumerable#grep
內部使用===
===
case when
這就是為什么你可以在if語句的case when
使用正則表達式和類和范圍甚至lambda表達式。
一些例子
case value
when /regexp/
# value matches this regexp
when 4..10
# value is in range
when MyClass
# value is an instance of class
when ->(value) { ... }
# lambda expression returns true
when a, b, c
# value matches one of a, b, c with `===`
when *array
# value matches an element in array with `===`
when x
# values is equal to x unless x is one of the above
end
所有這些示例也使用pattern === value
,以及grep
方法。
我只能猜測為什么沒有!==
方法,但是Tadman的直覺似乎很明顯, ===
主要通過case when
和grep
間接使用,因此可能似乎不需要顯式的逆運算符。 大多數生產代碼的樣式指南都禁止使用===
運算符。
如果您正在尋找其他相等運算符,請檢查.eql?
和.equal?
Ruby不需要嚴格的===
-type運算符,因為默認比較器==
已經非常嚴格,與PHP等不同。 通常不會進行任何類型的轉換,因此執行轉換的情況非常突出:
0 == ""
# => false
0 == "0"
# => false
"" == " "
# => false
0 == nil
# => false
0 == 0.0
# => true
事實上,當你使用===
你經常找麻煩通過過於具體或邀請意外的行為:
"" === String
# => false
String === ""
# => true
String === Object
# => false
Object === String
# => false
===
的含義由不同的類以不同的方式定義,意味着通常與“平等”無關的事物。 這只是一種像<<
有時候<<
這樣的簡寫。 Object === String
實際上是Object.===(String)
,這就是它從String.===(Object)
生成不同結果的原因String.===(Object)
。 在這種情況下,它意味着“等於......或派生類......”。
這是因為這種相對稀有!==
並不需要首先存在。 ===
通常只是間接使用,因為它是通過case
語句比較事物的默認方法。
啊......在深入挖掘后,我想我回答了自己的問題。 Ruby有.eql?
.equal?
鏈接
Ruby的等式並不嚴格使用==
,至少在JavaScript中不喜歡===
。 Ruby有更嚴格的等式方法,比如eql?
和equal?
,但===
並不是嚴格的平等。 ===
方法稱為包含運算符。 在case
語句中隱式使用它最常用。 這就是說
case a
when b ...
when c ...
else ...
end
相當於
if b === a
...
elsif c === a
...
else
...
end
話雖如此, !==
可能存在,但它僅僅留給用戶做!(a === b)
。 請注意, ===
不是可交換的,因為a === b
與b === a
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.