Clojure:使用{:keys[…]}解构并重命名

Clojure:使用{:keys[…]}解构并重命名,clojure,Clojure,是否可以一次性分解和重命名密钥 考虑这一点: (let[{:keys[response]}{:response 1}] (打印答复) 但是,如果我想将1称为我的响应,我必须执行以下操作: (let[{:keys[my response]}(clojure.set/rename-keys{:response 1}{:response:my response})] (打印我的回答) 显然,这不适用于defn解构 Clojure中是否有任何方法可以同时对键进行解构和重命名?在不使用:键的情况下使用

是否可以一次性分解和重命名密钥

考虑这一点:

(let[{:keys[response]}{:response 1}]
(打印答复)
但是,如果我想将
1
称为
我的响应
,我必须执行以下操作:

(let[{:keys[my response]}(clojure.set/rename-keys{:response 1}{:response:my response})]
(打印我的回答)
显然,这不适用于
defn
解构


Clojure中是否有任何方法可以同时对键进行解构和重命名?

在不使用
:键的情况下使用解构:

(let [{my-response :response} {:response 1}]
  (println my-response))

{:keys[response]}
{response:response}
的语法糖。如果您不介意使用库,可以从
tupelo.core/destruct
获得一个更强大的解构工具。以下是一个例子:

(ns tst.demo.core
  (:use demo.core tupelo.core tupelo.test))

(dotest
  (let [info  {:a 777
               :b [2 3 4]}
        mania [{:a 11} {:b 22} {:c [7 8 9]}]]
    (let [z ::dummy]
      (destruct [info {:a z
                       :b [d e f]}
                 mania [{:a ?} BBB {:c clutter}]]
        (is= z 777)
        (is= [d e f] [2 3 4])
        (is= a 11)
        (is= BBB {:b 22})
        (is= clutter [7 8 9])))))
因此,您可以看到在
析构函数
表达式中,符号
z
d
e
f
BBB
croot
被赋予了来自输入变量
info
mania
的相应值。特殊符号
被解释为意味着关键字
:a
创建一个符号
a
,以接收值
11

(let [{:keys [response]} {:response 1}
      my-response response]
   (println my-response))
有关更好的答案,请参阅

这个答案离问题更近了,但从技术上讲,并不是一步到位。但这并不涉及任何复杂的去结构化