我是Clojure的新手并且发现当我使用列表理解在clojure中循环这个向量时,我最后会得到一些nil
。
(def myVec [1,2,3])
user=> (for [x myVec] (println x))
(1
2
3
nil nil nil)
我使用map
user=> (map println myVec)
(1
2
3
nil nil nil)
在这些情况下打印nill的原因是什么?
答案 0 :(得分:9)
for
和map
创建一个新的延迟序列,原始向量中的每个元素都替换为(println element
)的结果,println
返回nil。
您不应该使用for
和map
对元素执行副作用(如打印)。请使用doseq
。
答案 1 :(得分:7)
这些nil
是println
的返回值。每次打电话
(println "something")
println
函数在标准输出上打印something
,然后返回nil
。代码中的整体效果是您看到所有println
调用的所有副作用(I / O),然后REPL打印来自每次调用的返回值(例如,三次nil
)。
答案 2 :(得分:1)
nil
是println返回的值,因此您看到打印的行后面是nil值的映射列表。