gpt4 book ai didi

dictionary - Clojure 映射中给定键 "updating"的惯用方式?

转载 作者:行者123 更新时间:2023-12-01 18:47:56 25 4
gpt4 key购买 nike

假设我们有一张看起来像这样的 map :

(def m {:a {:foo "bar"}})

现在我们想用一些新值更新 m 中的键 :a:

(def vs {:baz "qux"})

如果这是 Python,我们可以这样做:

>>> d = {'a': {'foo': 'bar'}}
>>> d['a'].update({'baz': 'qux'})
>>> d
{'a': {'foo': 'bar', 'baz': 'qux'}}

我发现的最简单的 Clojure 等价物是定义这样的函数:

(defn update-key
"
Updates a given key `k` over a map `m` with a map of values `vs`.
"
[k m vs]
(assoc m k (merge (k m) vs)))

然后调用如下:

(update-key :a m vs)
; => {:a {:foo "bar" :baz "qux"}}

所以我的问题是:实现与 Python dicts 提供的 update() 方法相同的功能的最惯用且正确的方法是什么?

最佳答案

我认为您正在寻找 assoc-in :

(def m {:a {:foo "bar"}})

(assoc-in m [:a :foo] "qux")
; => {:a {:foo "qux"}}

(assoc-in m [:a :baz] "qux")
; => {:a {:foo "bar", :baz "qux"}}

update-in类似,也可能值得一看。这实际上可能更接近您的 Python 示例:

(def m {:a {:foo "bar"}})
(def vs {:baz "qux"})

(update-in m [:a] merge vs)
; => {:a {:foo "bar", :baz "qux"}}
<小时/>

更新:

即使键是一个变量值(不是编译时常量),您仍然可以通过将变量放入来使用 update-inassoc-in向量:

(def m {:a {:foo "bar"}})
(def k' :baz)
(def v' "qux")

(assoc-in m [:a k'] v')
; => {:a {:foo "bar", :baz "qux"}}

您还可以通过编程方式构建向量:

(def m {:a {:foo "bar"}})
(def k' :baz)
(def v' "qux")

(let [ks (conj [:a] k')]
(assoc-in m ks v'))
; => {:a {:foo "bar", :baz "qux"}}

关于dictionary - Clojure 映射中给定键 "updating"的惯用方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15511970/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com