Clojure开发人员犯了哪些常见错误,我们如何避免这些错误呢?
例如; Clojure的新人认为这个contains?功能的作用是一样的java.util.Collection#contains.但是,contains?只有在使用索引集合(如地图和集合)并且您正在寻找给定键时,它才会起作用:
(contains? {:a 1 :b 2} :b)
;=> true
(contains? {:a 1 :b 2} 2)
;=> false
(contains? #{:a 1 :b 2} :b)
;=> true
Run Code Online (Sandbox Code Playgroud)
与数字索引集合(向量,数组)一起使用时,contains? 仅检查给定元素是否在有效索引范围内(从零开始):
(contains? [1 2 3 4] 4)
;=> false
(contains? [1 2 3 4] 0)
;=> true
Run Code Online (Sandbox Code Playgroud)
如果给出一个列表,contains?将永远不会返回true.
我正在学习pmap并编写以下函数:
(pmap #((println "hello from " (-> (Thread/currentThread) .getName))
(+ %1 %2))
[1 1 1] [-1 -1 -1])
Run Code Online (Sandbox Code Playgroud)
运行时,结果是a NullPointerException
(hello from clojure-agent-send-off-pool-4
hello from clojure-agent-send-off-pool-3
hello from clojure-agent-send-off-pool-5
NullPointerException user/eval55/fn--56 (NO_SOURCE_FILE:11)
Run Code Online (Sandbox Code Playgroud)
为什么会这样?我已经理解并观察到a的主体fn是隐含的do.
clojure ×2