我是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?
我是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?
那些 nil
是的回报值 println
。每次打电话
(println "something")
该 println
功能打印 something
在标准输出上,然后返回 nil
。代码中的整体效果是您可以看到所有副作用(I / O) println
调用,然后REPL打印来自每次调用的返回值(例如三次 nil
)。
for
和 map
创建一个新的延迟序列,原始向量中的每个元素都替换为(println element
),和 println
返回零。
你不应该使用 for
和 map
对元素执行副作用(如打印)。使用 doseq
为了那个原因。
nil
是println返回的值,因此您看到打印的行后面是nil值的映射列表。