Clojure:字符文字平等

时间:2016-02-26 15:15:47

标签: string clojure character

我认为,或许有些天真,Clojure中的单个字符串无论生成方式如何都会相等。

(= "G" "G")
=>
true

(= "G" \G)
=>
false

(= \G \G)
=>
true

事实证明并非如此。任何人都可以解释原因吗?

2 个答案:

答案 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]
;=> }"]