我正在尝试定义一个接受地图和常规参数的函数,我想解构地图的某些部分,比如
(defn do-stuff
[[{:keys [foo bar]} where] what]
(println foo bar what))
但是当我调用函数时出现错误
; Execution error (UnsupportedOperationException) at .../do-stuff (REPL:34).
; nth not supported on this type: PersistentArrayMap
如果我交换函数参数
(defn do-stuff
[what [{:keys [foo bar]} where]]
(println foo bar what))
一切正常。当然我可以在函数里面写一个
let
然后在那里进行解构,但我想知道我错过了什么......
编辑:澄清我希望能够像这样调用函数
(do-stuff {:foo "something" :bar "something else"} "baz")
既然你没能告诉我们,你的电话是什么,我猜是,那 你把
let
的解构语法和上面的语法混淆了
功能。
所以下面的调用起作用了——注意地图向量中的嵌套 和悬空
where
:
(defn do-stuff
[[{:keys [foo bar]} where] what]
(println foo bar what))
(do-stuff [{:foo 1 :bar 2} 3] 4)
; 1 2 4
(defn do-stuff
[what [{:keys [foo bar]} where]]
(println foo bar what))
(do-stuff 0 [{:foo 1 :bar 2} 3])
; 1 2 0
因为你不打印
where
,所以看起来你想坚持下去
地图本身。但这是通过:as
完成的。
(defn do-stuff
[{:keys [foo bar] :as where} what]
(println foo bar where what))
(do-stuff {:foo 1 :bar 2 :baz 3} 4)
; 1 2 {:foo 1, :bar 2, :baz 3} 4