Clojure:分解并使用{:keys [...]}重命名

时间:2019-08-21 12:37:08

标签: clojure

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

考虑一下:

(let [{:keys [response]} {:response 1}]
  (println response))

但是,如果我想将1称为my-response,则必须执行以下操作:

(let [{:keys [my-response]} (clojure.set/rename-keys {:response 1} {:response :my-response})]
  (println my-response))

显然,这不适用于defn销毁。

Clojure中有什么办法可以同时解构和重命名密钥?

3 个答案:

答案 0 :(得分:13)

不使用:keys进行销毁:

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

{:keys [response]}{response :response}的语法糖。

答案 1 :(得分:0)

您在这里:

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

有关更好的答案,请参见https://stackoverflow.com/a/57592661/2757027

此答案更接近问题,但从技术上讲并非一步之遥。但这不涉及任何复杂的重构。

答案 2 :(得分:-1)

如果您不介意使用库,可以从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])))))

因此您可以看到在destruct表达式中,符号zdefBBB和从输入变量clutterinfo中向mania给出相应的值。特殊符号?的解释是,关键字:a创建一个符号a来接收值11