Selon http://hyperpolyglot.org/lisp , les seuls mensonges de Clojure sont d'autre part, il est en quelque sorte est em> faux: faux code> et
nil code>. En effet, assez étonnamment,
(booléen. Faux) code> n'est pas faux:
user=> (class false)
java.lang.Boolean
user=> (= false (Boolean. false))
true
3 Réponses :
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. P>
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. P>
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. p>
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) code> se comporte dans des clauses if-clauses tout comme on pourrait s'attendre (bien que je ne voie pas une utilisation pour cela).
Je pense que la raison pour laquelle cela se produit est que Clojure's = utilise Java's Notez que cela ne signifie pas que Equals code> méthode. Donc
(= x y) code> est comme
x.equals (y) code>. Donc,
false code> est contraint à
(booléen. Faux) code> dans la comparaison sous la hotte. P>
(booléen. FAUX) code> est faux em> ou que c'est est le "même" que faux em>, juste que lorsque
false code> et
(booléen. Faux) code> est comparé à l'aide de la méthode
Equals code> est considérée comme étant égale. p>
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: P>
[...] Tous les [...] conditionnels de clojure sont basés sur la même logique, c'est-à-dire nul fort> et
faux fort> 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 em> stry> 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. em> p> blockQuote> comparer p>
xxx pré> avec p>
xxx pré> Ainsi,
(falseen) < / code> n'est ni
nil code> ni
faux code>, tout comme
(objet.) code> n'est ni
nil code> ni
faux code>. Et comme @chiron a souligné, c'est une mauvaise pratique de l'utiliser quand même. P>
comme pour
(= faux (booléen. Faux)) code> être vrai, je pense que l'explication de looby est Spot sur: Etant donné que
= code> s'appuie sur la méthode de Java's CODE> EQUALES code>, 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. p> p>