9

http://hyperpolyglot.org/lispによると、Clojure の唯一の虚偽はfalsenilです。実際、驚くべきことに、(Boolean. 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

これはかなり直感に反します。この動作には理由がありますか、それとも単に見落とされていましたか?

4

3 に答える 3

5

(Boolean. true) または (Boolean. "true") を呼び出すことは決してありません。Boolean クラスのインスタンスを作成しないでください。それらの2つのフォームは本当に邪悪です。

これは Clojure の問題ではなく、実際には Java の問題です。

ブール値には、Java によってすでに提供されている true または false の 2 つの値しかありません。コンストラクターは、ブール値として動作できるブール値クラスの新しいインスタンスを作成できるという錯覚を与えますが、そうではありません。

本当に String または boolean から Boolean インスタンスを作成したい場合は、Boolean クラスの valueOf() メソッドを使用します。

(Boolean/valueOf "true")
(Boolean/valueOf  true)

Boolean.html#valueOf(ブール値)

于 2013-09-07T19:34:55.923 に答える