Clojure 非嵌套结构的更新与更新功能

Clojure 非嵌套结构的更新与更新功能,clojure,Clojure,我查看了一些,注意到两位不同的作者(针对“超”和“平衡”示例)使用了: 而不是简单地 (update s :x + dx vx) 这有什么原因吗?如果s是一个嵌套很深的结构,是的,那么它是有意义的。但在这两种情况下,键列表只有一个条目,因此对我来说,上面的两个片段似乎是等效的: (let [dx 1 vx 2 s {:x 5}] (println (update-in s [:x] + dx vx)) (println (update s :x + dx vx)

我查看了一些,注意到两位不同的作者(针对“超”和“平衡”示例)使用了:

而不是简单地

(update s :x + dx vx)
这有什么原因吗?如果
s
是一个嵌套很深的结构,是的,那么它是有意义的。但在这两种情况下,键列表只有一个条目,因此对我来说,上面的两个片段似乎是等效的:

(let [dx 1
      vx 2
      s {:x 5}]
  (println (update-in s [:x] + dx vx))
  (println (update s :x + dx vx)))

{:x 8}
{:x 8}
除了中的
更新可能会有多一点开销

我能想到的唯一原因是,如果他们在将来嵌套状态,它将简化转换。然而,对于这样一个简单的例子,这似乎不太可能,特别是考虑到到处都有魔法常数

当结构没有嵌套时,是否有任何理由在
更新中使用
更新,而不是
更新?

如果您这样做,您将看到它们都在封面下使用
assoc
。除了风格和代码的清晰性,考虑到附近的和相关的代码之外,没有理由选择其中一个

另外,
update
直到Clojure 1.7才被添加,这可能会在选择中发挥作用

另外,如果您在
中查找缺少的函数
dissoc,您可以找到它。

如果您查找,您将看到它们都在封面下使用
assoc
。除了风格和代码的清晰性,考虑到附近的和相关的代码之外,没有理由选择其中一个

另外,
update
直到Clojure 1.7才被添加,这可能会在选择中发挥作用


注意:如果您在
中查找缺少的函数
dissoc,您可以找到它。

对于非嵌套结构,没有理由在
中使用
更新,而
更新
是首选。

对于非嵌套结构,没有理由在中使用更新,而
更新
是首选。

(a)为什么dissoc与此相关?(b) 如果您打算建议使用您自己的库,请明确指出它是您自己的。(a)为什么dissoc在这里是相关的?(b) 如果你打算建议使用你自己的图书馆,请明确指出它是你自己的。
(let [dx 1
      vx 2
      s {:x 5}]
  (println (update-in s [:x] + dx vx))
  (println (update s :x + dx vx)))

{:x 8}
{:x 8}