9
votes

(Booléen. Faux) dans le clojure

Selon http://hyperpolyglot.org/lisp , les seuls mensonges de Clojure sont faux code> et nil code>. En effet, assez étonnamment, (booléen. Faux) code> n'est pas faux: xxx pré>

d'autre part, il est en quelque sorte est em> faux:

user=> (class false)
java.lang.Boolean
user=> (= false (Boolean. false))
true


0 commentaires

3 Réponses :


5
votes

Ne jamais appeler et n'appeler jamais (booléen. vrai) ou (booléen. "vrai"). Ne créez aucune instance de classe booléenne. Ces deux formes sont vraiment mauvaises.

Ce n'est pas un problème de clojure, c'est en fait un java.

Il n'y a que deux valeurs possibles pour un booléen: vrai ou faux qui sont déjà fournis par Java. Les constructeurs vous donnent l'illusion que vous pouvez créer une nouvelle instance de classe booléenne qui peut se comporter comme un booléen, mais ce ne sera pas.

Si vous voulez vraiment créer une instance booléenne à partir d'une chaîne ou d'un booléen , puis utilisez la valeur de la valeur () de la classe booléenne. xxx

Boolean.html # Valeur de (Boolean)


3 commentaires

Au fur et à mesure que le reste de la publication explique, ils semblent créer un booléen utilisable, mais ils ne le font pas. Cela peut causer des bugs étranges étranges.


@NoiseSmith Oui En effet et c'est pourquoi personne ne devrait essayer de créer une instance booléenne en appelant le constructeur.


Merci d'avoir répondu. Mais je ne vois pas vraiment pourquoi il s'agit d'une question de Java. Je veux dire, en Java, nouveau booléen (faux) se comporte dans des clauses if-clauses tout comme on pourrait s'attendre (bien que je ne voie pas une utilisation pour cela).



3
votes

Je pense que la raison pour laquelle cela se produit est que Clojure's = utilise Java's Equals méthode. Donc (= x y) est comme x.equals (y) . Donc, false est contraint à (booléen. Faux) dans la comparaison sous la hotte.

Notez que cela ne signifie pas que (booléen. FAUX) est faux ou que c'est est le "même" que faux , juste que lorsque false et (booléen. Faux) est comparé à l'aide de la méthode Equals est considérée comme étant égale.


0 commentaires

13
votes

Vous pouvez trouver l'explication à http://clojure.org/special_forms#if .

Il est bon de lire tout le paragraphe, mais voici le bit crucial extrait, je souligne:

[...] Tous les [...] conditionnels de clojure sont basés sur la même logique, c'est-à-dire nul et faux constitue une fausseté logique, et tout sinon constitue une vérité logique et ces significations s'appliquent tout au long de l'emploi. [...] Notez que si ne teste pas les valeurs arbitraires de java.lang.booleren, uniquement la valeur singulière false (java's boolean.false), Donc, si vous créez vos propres booléens boxés, assurez-vous d'utiliser Boolean / ValueOf et non les constructeurs booléens.

comparer xxx

avec xxx

Ainsi, (falseen) < / code> n'est ni nil ni faux , tout comme (objet.) n'est ni nil ni faux . Et comme @chiron a souligné, c'est une mauvaise pratique de l'utiliser quand même.

comme pour (= faux (booléen. Faux)) être vrai, je pense que l'explication de looby est Spot sur: Etant donné que = s'appuie sur la méthode de Java's EQUALES , la sémantique spéciale des conditionnels dans le clojure ne s'applique pas et l'égalité booléenne sera telle qu'elle est en Java.


0 commentaires