Laut Ссылка sind die einzigen Unwahrheiten in Clojure false
und nil
. Tatsächlich ist (Boolean. false)
überraschenderweise nicht falsch:
Andererseits ist es irgendwie falsch:
%Vor%Dies ist eher nicht intuitiv. Gibt es Gründe für dieses Verhalten oder wurde es einfach übersehen? Treten ähnliche Dinge mit anderen Java-Datentypen in Clojure auf? Funktioniert es in ClojureScript und ClojureCLR genauso oder ist es spezifisch für die JVM-Version? Zeigen andere JVM-Lisps, wie Kawa oder ABCL, ein ähnliches Verhalten (wenn sie überhaupt Java-Booleans verwenden)?
Sie finden die Erklärung unter Ссылка .
Es ist gut, den ganzen Absatz zu lesen, aber hier ist das entscheidende Bit excerpted, Hervorhebung hinzugefügt:
[...] Alle Bedingungen in Clojure basieren auf derselben Logik, dh nil und false sind logische Falschheit und alles sonst besteht eine logische Wahrheit, und diese Bedeutungen gelten durchgängig. [<] Beachten Sie, dass wenn nicht nach beliebigen Werten von java.lang.Boolean sucht, sondern nur nach dem singulären Wert false (Java's Boolean.FALSE), Wenn Sie also eigene Box-Booleans erstellen, stellen Sie sicher, dass Sie Boolean / valueOf und nicht die booleschen Konstruktoren verwenden.
Vergleichen
%Vor%mit
%Vor% Somit ist (Boolean. false)
weder nil
noch false
, genauso wie (Object.)
weder nil
noch false
ist. Und wie @Chiron darauf hingewiesen hat, ist es eine schlechte Übung, es trotzdem zu benutzen.
Da (= false (Boolean. false))
wahr ist, denke ich, dass @ loobys Erklärung genau richtig ist: Da =
auf der Methode equals
von Java beruht, gelten die speziellen Semantiken der Bedingungen in Clojure nicht und die boolesche Gleichheit ist wie Es ist in Java.
Nicht immer und niemals aufrufen (Boolean. True) oder (Boolean. "True"). Erstellen Sie keine Instanz der Booleschen Klasse. Diese zwei Formen sind wirklich böse.
Dies ist kein Problem von Clojure, eigentlich ist es eines von Java.
Es gibt nur zwei mögliche Werte für einen booleschen Wert: true oder false, die bereits von Java bereitgestellt werden. Die Konstruktoren geben Ihnen die Illusion, dass Sie eine neue Instanz der Booleschen Klasse erstellen können, die sich wie ein Boolean verhalten kann, aber nicht.
Wenn Sie wirklich eine boolesche Instanz aus einem String oder einem booleschen Wert erstellen möchten, verwenden Sie die valueOf () -Methode der booleschen Klasse.
%Vor% Ich denke, der Grund dafür ist, dass Clojure = die Methode equals
von Java verwendet. Also (= x y)
ist wie x.equals(y)
. So wird false
im Vergleich unter der Haube in (Boolean. false)
umgewandelt.
Beachten Sie, dass dies nicht bedeutet, dass (Boolean. false)
falsch ist oder dass es das gleiche wie false ist, nur wenn false
und (Boolean. false)
Mit der Methode equals
verglichen werden sie als gleich betrachtet.