2

如何将符号重新绑定到 Clojure 中的新数据结构。例如:

 (def hash-map-one {:a "foo" :b "bar"})
 (def hash-map-two {:c "gaz" :d "waka"})

 ;; right here make hash-map-one equal to hash-map-two very quickly
 ;; if this were python I would say hash-map-one = hash-map-two

有点动机,我这样做是因为我有一个依赖于数据文件的 Web 服务,并且该数据文件将被更新,此时我需要在不停机的情况下“切换”到新数据。

提前致谢!

4

1 回答 1

5

鉴于您的用例,使用原子可能最有意义:

(def data (atom {:map 'of :initial "data"}))

(reset! data {:map 'of :new "data"})

如果出于某种原因您更喜欢使用 Var,则可以使用alter-var-root切换到新值。您也可以使用intern,尽管那样您将失去alter-var-root的原子性保证(请参阅文档字符串和此答案;评论 re:def同样适用于intern)。

在 REPL 中,使用def重新绑定现有的 Var 非常好,但是在生产代码中这通常不是一个好主意(在 Clojure 实现中发现了一些值得注意的异常——一个非常特殊的情况)。最重要的是,def应该只在将立即执行它的顶级表单中使用;也就是说,它应该是一个顶级表单本身,或者是一个顶级表单的主体部分,例如let. 否则怪事接踵而至

于 2013-05-31T03:24:27.393 回答