我认为,或许有些天真,Clojure中的单个字符串无论生成方式如何都会相等。
(= "G" "G")
=>
true
(= "G" \G)
=>
false
(= \G \G)
=>
true
事实证明并非如此。任何人都可以解释原因吗?
答案 0 :(得分:5)
字符不与单字符字符串相同。相反,单个字符的字符串可以被认为是一个序列,其第一个和唯一的项目是一个字符。
(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
答案 1 :(得分:5)
仅仅是为了完整性...与Clojure不同,ClojureScript的行为与OP推测完全相同。由于Javascript没有字符类型,只有String,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]
;=> }"]