我有些天真地认为,在Clojure中,无论如何生成单个字符字符串,它们都是相等的。
(= "G" "G")
=>
true
(= "G" \G)
=>
false
(= \G \G)
=>
true
原来并不是这样。有人能解释一下吗?
一个字符并不等同于一个单字符字符串。相反,单字符字符串可以被视为一个序列,其第一个且唯一的项是一个字符。
(type "G")
;=> java.lang.String
(type \G)
;=> java.lang.Character
(count "G")
;=> 1
(count \G)
;=> UnsupportedOperationException count not supported on this type: Character
(seq "G")
;=> (\G)
(seq \G)
;=> IllegalArgumentException Don't know how to create ISeq from: java.lang.Character
(first "G")
;=> \G
(first \G)
;=> IllegalArgumentException Don't know how to create ISeq from: java.lang.Character
为了完整起见……ClojureScript与Clojure不同,其行为与OP所推测的完全相同。由于Javascript没有字符类型,只有字符串,因此ClojureScript字符被实现为单个字符字符串。
在ClojureScript REPL中:
(= "G" "G")
;=> true
(= "G" \G)
;=> true
(= \G \G)
;=> true
(type "G")
;=> #object[String "function String() {
;=> [native code]
;=> }"]
(type \G)
;=> #object[String "function String() {
;=> [native code]
;=> }"]