是否可以一次性分解和重命名密钥?
考虑一下:
(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中有什么办法可以同时解构和重命名密钥?
答案 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
表达式中,符号z
,d
,e
,f
,BBB
和从输入变量clutter
和info
中向mania
给出相应的值。特殊符号?
的解释是,关键字:a
创建一个符号a
来接收值11
。