为什么我们可以写
(defn factory-foo [] (fn [] (println "foo")))
(apply (factory-foo) [])
但不是:
(defn factory-bar [] #((println "bar")))
(apply (factory-bar ) []) ;throws NPE
这是一个错误吗?
答案 0 :(得分:7)
#((println "bar))
由读者翻译为(fn [] ((println "bar")))
- 请注意额外的括号。 (println "bar")
此处打印bar
并返回nil
,然后由于外括号而将nil
本身作为函数调用。 nil
实际上是null
,并试图将其解除引用至NPE。
要避免这种情况,只需在#(..)
#(println "bar")
内删除额外的一对括号。