Clojure中的(Boolean.false)

根据http://hyperpolyglot.org/lisp,Clojure中唯一的虚假是假和无.确实,令人惊讶的是,(布尔值.false)不是false:

user=> (if (Boolean. false) 1 2)
1
user=> (not (Boolean. false))
false
user=> (false? (Boolean. false))
false

另一方面,它某种程度上是错误的:

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

这是违反直觉的.是否有这种行为的原因,或者只是被忽略了? Clojure中的其他Java数据类型也会发生类似的情况吗?它在ClojureScript和ClojureCLR中工作是否相同,还是特定于JVM版本?其他JVM Lisps(例如Kawa或ABCL)是否表现出类似的行为(如果它们完全使用Java布尔值)?

最佳答案
您可以在http://clojure.org/special_forms#if处找到说明.

阅读整个段落很好,但是这里摘录了关键部分,并强调了:

[…] All […] conditionals in Clojure are based upon the same logic, that is, nil and false constitute logical falsity, and everything else constitutes logical truth, and those meanings apply throughout. […] Note that if does not test for arbitrary values of java.lang.Boolean, only the singular value false (Java’s Boolean.FALSE), so if you are creating your own boxed Booleans make sure to use Boolean/valueOf and not the Boolean constructors.

相比

System.out.println(Boolean.valueOf(false) ? true : false);  // false
System.out.println(new Boolean(false)     ? true : false);  // false

user=> (if (Boolean/valueOf false) true false)
false
user=> (if (Boolean. false) true false)
true

因此,(Boolean.false)既不为零也不为假,就像(Object.)既不为零也不为假.正如@Chiron所指出的,无论如何都使用它是一个坏习惯.

至于(= false(Boolean.false))为真,我认为@looby的解释很明确:由于=依赖Java的equals方法,因此Clojure中条件条件的特殊语义不适用,布尔相等将保持不变用Java.

转载注明原文:Clojure中的(Boolean.false) - 代码日志