(Boolean. false) in Clojure

8

Laut Ссылка sind die einzigen Unwahrheiten in Clojure false und nil . Tatsächlich ist (Boolean. false) überraschenderweise nicht falsch:

%Vor%

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)?

    
zabolekar 07.09.2013, 19:17
quelle

3 Antworten

12

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.

    
glts 08.09.2013, 10:37
quelle
5

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%

Boolean.html # valueOf (boolean)

    
Chiron 07.09.2013 19:34
quelle
3

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.

    
robertjlooby 07.09.2013 19:59
quelle

Tags und Links