Ich frage mich nur, was !!
in Ruby ist.
134
Nicht nicht. Es wird verwendet, um einen Wert in einen Booleschen Wert umzuwandeln:
!!nil #=> false
!!"abc" #=> true
!!false #=> false
Es ist jedoch normalerweise nicht erforderlich, es zu verwenden, da die einzigen falschen Werte für Ruby nil
und false
sind. Daher ist es normalerweise am besten, diese Konvention beizubehalten.
Betrachten Sie es als
!(!some_val)
Eine Sache, für die es zu Recht verwendet wird, ist die Verhinderung der Rückgabe eines großen Datenblocks. Beispielsweise möchten Sie wahrscheinlich nicht 3 MB Bilddaten in Ihrer has_image?
Methode zurückgeben, oder Sie möchten möglicherweise nicht Ihr gesamtes Benutzerobjekt in der logged_in?
Methode zurückgeben. Using !!
konvertiert diese Objekte in ein einfaches true
/ false
.
.nil?
anstatt zu benutzen!!
? Ist da ein Unterschied?!!true #=> true
undtrue.nil? #=> false
Es wird zurückgegeben,
true
wenn das Objekt rechts nicht istnil
und nichtfalse
,false
wenn esnil
oder istfalse
quelle
!
bedeutet negieren booleschen Zustand, zwei!
s ist nichts Besonderes, außer einer doppelten Negation.Es wird häufig verwendet, um eine Methode zu zwingen, einen Booleschen Wert zurückzugeben. Es erkennt jede Art von Wahrhaftigkeit, wie z. B. Zeichenfolge, Ganzzahlen und was nicht, und verwandelt sie in einen Booleschen Wert.
Ein realistischerer Anwendungsfall:
Dies ist nützlich, wenn Sie sicherstellen möchten, dass ein Boolescher Wert zurückgegeben wird. IMHO ist es irgendwie sinnlos zu sehen, dass beide
if 'some string'
undif true
genau der gleiche Fluss sind, aber einige Leute finden es nützlich, einen Booleschen Wert explizit zurückzugeben.quelle
title
, können Sie auch das nächste tun ... Ich nehme anBeachten Sie, dass diese Redewendung auch in anderen Programmiersprachen vorhanden ist. C hatte keinen intrinsischen
bool
Typ, daher wurden alle Booleschenint
Werte stattdessen mit kanonischen Werten von0
oder eingegeben1
. Nimmt dieses Beispiel (zur Verdeutlichung Klammern hinzugefügt):Die "Nicht-Nicht" -Syntax konvertiert jede Ganzzahl ungleich Null in
1
den kanonischen booleschen wahren Wert.Im Allgemeinen finde ich es jedoch viel besser, einen vernünftigen Vergleich anzustellen, als diese ungewöhnliche Redewendung zu verwenden:
quelle
Es ist nützlich, wenn Sie ein exklusives oder tun müssen . Kopie von Matt Van Horns Antwort mit geringfügigen Änderungen:
Ich habe es verwendet, um sicherzustellen, dass zwei Variablen entweder beide null oder beide nicht null sind.
quelle
Es ist "doppelt negativ", aber die Praxis wird entmutigt. Wenn Sie Rubocop verwenden , werden Sie feststellen , dass es sich bei einem solchen Code mit einem beschwert
Style/DoubleNegation
Verstoß .Die Begründung lautet:
quelle
!!false # => false
während!false.nil? # => true
!(foo.nil? || foo == false)
- ausführlicher, ja, aber weniger kryptisch.Zu verstehen, wie es funktioniert, kann hilfreich sein, wenn Sie beispielsweise eine Aufzählung in einen Booleschen Wert konvertieren müssen. Ich habe Code, der genau das mit dem
classy_enum
Edelstein macht:Dann habe ich im Service-Code zum Beispiel:
Tatsächlich ist der Bangbang-Operator zu dem geworden, was ich sonst als Methode namens to_bool geschrieben hätte.
quelle