在 clojure 中解构映射函数参数:映射需要放在最后吗?

问题描述 投票:0回答:1

我正在尝试定义一个接受地图和常规参数的函数,我想解构地图的某些部分,比如

(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")
clojure destructuring
1个回答
1
投票

既然你没能告诉我们,你的电话是什么,我猜是,那 你把

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
© www.soinside.com 2019 - 2024. All rights reserved.