【问题标题】:Wrong number of args (0) passed to: PersistentArrayMap for "map"传递给的 args (0) 数量错误:“map”的 PersistentArrayMap
【发布时间】:2016-08-19 10:43:24
【问题描述】:

我已经混淆了这段代码。

为什么会这样:

(let [
   items [{:var1 x, :var2  x, :var3 (:something x), :var4 (:something2 x)}]

;..........
(my-func items) ; ok

而这会产生异常:

(let [
   items (map (fn [x] ({:var1 x, :var2 x, :var3 (:something x), :var4 (:something2 x)})) (db/get-items-from-db))

    ;..........
    (my-func items) ; error

这是

 Wrong number of args (0) passed to: PersistentArrayMap

【问题讨论】:

  • 你的items-from-db 是什么?你到底想做什么?

标签: clojure


【解决方案1】:

当我们把它剥离到骨头上时,我们有这个:

(map (fn [x] ({:a x :b (:c x)})) '({:c "abc"}))

这会产生你的错误。

问题是地图定义周围有括号,因此,地图被视为一个函数,在这种情况下没有给它任何参数。删除括号,它可以工作:

(map (fn [x] {:a x :b (:c x)}) '({:c "abc"}))
;; ({:a {:c "abc"}, :b "abc"})

这与尝试执行此操作的错误相同:

(defn func [x]
  ({:a x :b (:c x)}))

事实上你想要的时候:

(defn func [x]
  {:a x :b (:c x)})

如果我们记得 map 可以用作函数,它可能有助于进一步理解,其中参数指定要返回哪个键的值:

({:a 1 :b 2} :b)
;; 2

虽然我们经常反其道而行之,使用 key 作为函数:

(:b {:a 1 :b 2})
;; 2

所以我们也可以通过为正在创建的地图指定一个参数(在本例中为 :b)来消除错误,尽管它不会产生隐含的期望结果:

(map (fn [x] ({:a x :b (:c x)} :b)) '({:c "abc"}))
;; ("abc")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多