2016-02-26 50 views
3

我推測,也許天真地說,Clojure中的單個字符串將是平等的,無論它們是如何生成的。Clojure:字符文字相等

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

(= "G" \G) 
=> 
false 

(= \G \G) 
=> 
true 

事實並非如此。誰能解釋爲什麼?

回答

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 
+0

附加說明和實踐也可作爲[Clojure的Koans]的一部分(https://github.com/functional-koans/clojure-koans) – imranolas

5

只是爲了完整...與Clojure不同,ClojureScript的行爲與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] 
;=> }"]