带有rest参数的匿名函数抛出NullPointerException

时间:2015-10-24 22:50:02

标签: clojure

这是功能

(#(
   (println (str "first: " %1))
   (println (str "second: " %2))
   (println (str "rest: " (clojure.string/join ", " %&))))
 "f" "s" "x" "y" "z")

在苹果酒中运行时,我得到了理想的结果,但最后我发现我也得到了NullPointerException。

似乎这种形式的匿名函数在解构时存在一些问题。

因为,当我尝试使用以下形式的匿名函数时,它可以正常工作。

((fn [f s & rest]
    (println (str "first: " f))
    (println (str "second: " s))
    (println (str (clojure.string/join ", " rest))))
   "f" "s" "x" "y" "z")

有人可以解释为什么会这样吗?

1 个答案:

答案 0 :(得分:3)

您需要do

(#(do
   (println (str "first: " %1))
   (println (str "second: " %2))
   (println (str "rest: " (clojure.string/join ", " %&))))
 "f" "s" "x" "y" "z")

如果没有do,您就会尝试在列表的其余元素上调用第一个println的结果(即nil)。 fn有一个隐含的do

对于最小的情况,请比较((println))(do (println))