簡體   English   中英

為什么Ruby沒有!==運算符?

[英]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 whengrep間接使用,因此可能似乎不需要顯式的逆運算符。 大多數生產代碼的樣式指南都禁止使用===運算符。

如果您正在尋找其他相等運算符,請檢查.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 === bb === a

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM