我在REPL中使用了序列,並遇到以下行爲,至少在我看來,這很不直觀。所以我評估表達(cons '("1" "2") "3")
期望它產生(("1" "2") "3")
,但取而代之的是產生(("1" "2") \3)
。爲什麼Clojure強制字符串與字符
有人可以解釋爲什麼在這種情況下,Clojure自動強制string
到character
?我認爲這與字符串的內部表示形式有關。
我在REPL中使用了序列,並遇到以下行爲,至少在我看來,這很不直觀。所以我評估表達(cons '("1" "2") "3")
期望它產生(("1" "2") "3")
,但取而代之的是產生(("1" "2") \3)
。爲什麼Clojure強制字符串與字符
有人可以解釋爲什麼在這種情況下,Clojure自動強制string
到character
?我認爲這與字符串的內部表示形式有關。
的第二個參數是cons
的序列:
(利弊X SEQ)
返回一個新的SEQ其中x是所述第一元件和seq是 其餘部分。
現在你應該知道,如果你不給它,clojure會自動爲你創建一個序列。例如,調用seq
(其中cons
確實爲你)會告訴你該字符串轉換成字符序列:
else if(coll instanceof CharSequence)
return StringSeq.create((CharSequence) coll);
相反,如果你想:
(seq "32")
=> (\3 \2)
這是由Clojure的runtime in RT.java完成字符被視爲一個單一的項目然後你可以包裝它:
(cons '("1" "2") '("3"))
=> (("1" "2") "3")
它不強制將字符串強制轉換爲字符,而是將字符串強制轉換爲字符序列,因爲第二個參數必須是集合。
cons
將一個項目作爲其第一個arg,將一個集合作爲第二個。該集合被強制爲通過seq
函數的列表。
user=> (seq "3")
(\3)
如果你想使用cons
預先設置列表("1" "2")
榜上有名("3")
那麼你可以做如下:
user=> (cons '("1" "2") '("3"))
(("1" "2") "3")
也許你想(("1" "2") . "3")
,那種非列表利弊你可以做其他口頭禪,但Clojure根本沒有這種類型的利弊。
'cons'強制字符串,而不是一個字符,而是字符* seq uence *。 – Thumbnail