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

时间:2017-01-05 20:37:00

标签: clojure

我正在查看一些Quil examples,并注意到2位不同的作者(对于" Hyper"和#34;均衡"示例)使用了:

(update-in s [:x] + dx vx)

而不是简单

(update s :x + dx vx)

这有什么理由吗?如果s是一个深层嵌套的结构,那么,这是有意义的。但在这两种情况下,键列表只有1个条目,所以对我来说,上面的2个片段看起来是等价的:

(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}

除了update-in可能会有更多的开销。

我能想到的唯一原因是,如果他们将该状态嵌套在未来,它将缓解过渡。对于这样一个简单的例子,这似乎不太可能,特别是考虑到各处都有魔术常数。

当结构没有嵌套时,是否有理由使用update-in而不是update

2 个答案:

答案 0 :(得分:2)

如果您look at the source code,您会看到他们都使用assoc。除了样式和代码清晰度之外,没有理由更喜欢其中一个,考虑附近和相关代码。

此外,在Clojure 1.7之前没有添加update,这可能会在选择中发挥作用。

P.S。如果您一直在寻找缺失的函数dissoc-in,您可以找到它in the Tupelo library

答案 1 :(得分:2)

没有理由将update-in用于非嵌套结构,并且首选update