zab*_*kar 9 jvm boolean clojure
根据http://hyperpolyglot.org/lisp,Clojure中唯一的谎言是false
和nil
.确实,令人惊讶的(Boolean. false)
是,并非虚假:
user=> (if (Boolean. false) 1 2)
1
user=> (not (Boolean. false))
false
user=> (false? (Boolean. false))
false
Run Code Online (Sandbox Code Playgroud)
另一方面,它在某种程度上是错误的:
user=> (class false)
java.lang.Boolean
user=> (= false (Boolean. false))
true
Run Code Online (Sandbox Code Playgroud)
这是违反直觉的.这种行为有原因还是被忽视了?Clojure中的其他Java数据类型是否也会发生类似的事情?它在ClojureScript和ClojureCLR中是否相同,或者它是否特定于JVM版本?其他JVM Lisps,如Kawa或ABCL,是否表现出类似的行为(如果他们根本使用Java布尔值)?
glt*_*lts 12
您可以在http://clojure.org/special_forms#if找到解释.
阅读整个段落是件好事,但这里的关键部分摘录,重点补充:
[...] Clojure中的所有条件都基于相同的逻辑,即,nil和false构成逻辑错误,其他一切构成逻辑真理,这些含义贯穿始终.[...] 注意,如果不测试java.lang.Boolean的任意值,只有奇异值false(Java的Boolean.FALSE),所以如果你要创建自己的盒装布尔值,请确保使用Boolean/valueOf和不是布尔构造函数.
相比
System.out.println(Boolean.valueOf(false) ? true : false); // false
System.out.println(new Boolean(false) ? true : false); // false
Run Code Online (Sandbox Code Playgroud)
同
user=> (if (Boolean/valueOf false) true false)
false
user=> (if (Boolean. false) true false)
true
Run Code Online (Sandbox Code Playgroud)
因此,(Boolean. false)
既不是nil
也不是false
,就像(Object.)
既不是nil
也不是false
.正如@Chiron指出的那样,无论如何使用它都是不好的做法.
至于(= false (Boolean. false))
是真的,我认为@ looby的解释是正确的:因为=
依赖于Java的equals
方法,Clojure中条件的特殊语义不适用,并且布尔相等将与Java一样.
永远不要,永远不要调用(Boolean.true)或(Boolean."true").不要创建任何布尔类的实例.这两种形式真的很邪恶.
这不是Clojure的问题,实际上它是Java的问题.
boolean只有两个可能的值:true或false,它们已由Java提供.构造函数给你一种错觉,你可以创建一个布尔类的新实例,它可以表现为布尔但不会.
如果你真的想从String或boolean创建一个Boolean实例,那么使用Boolean类的valueOf()方法.
(Boolean/valueOf "true")
(Boolean/valueOf true)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
882 次 |
最近记录: |