我在 REPL 中尝试了序列,并遇到了以下行为,至少对我来说,这是非常不直观的。所以我评估了表达式 (cons '("1""2") "3")
期望它产生 (("1""2") "3")
但它却产生了 (("1""2")\3)
。
有人可以解释一下为什么 Clojure 在这种情况下会自动将 string
强制转换为 character
吗?我认为这与字符串作为字符序列的内部表示有关。
最佳答案
cons 的第二个参数是一个序列:
(cons x seq)
Returns a new seq where x is the first element and seq is the rest.
现在你应该知道,如果你不给它一个序列,Clojure 会自动为你创建一个序列。例如,调用 seq
(cons
为您做的事情)将显示字符串已转换为字符序列:
(seq "32")
=> (\3 \2)
这是由 clojure 的 runtime in RT.java 完成的:
else if(coll instanceof CharSequence)
return StringSeq.create((CharSequence) coll);
相反,如果您希望将角色视为单个项目,那么您可以将其包装起来:
(cons '("1" "2") '("3"))
=> (("1" "2") "3")
关于clojure - 为什么 Clojure 将字符串强制转换为带有 cons 的字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32297823/