gpt4 book ai didi

Clojure 惯用的 get-and-set 函数

转载 作者:行者123 更新时间:2023-12-02 02:15:52 24 4
gpt4 key购买 nike

在 Clojure 中编写 get-and-set 函数是否有比以下更惯用/可读的方式:

(def the-ref (ref {}))

(defn get-and-set [new-value]
(dosync
(let [old-value @the-ref]
(do
(ref-set the-ref new-value)
old-value))))

最佳答案

对于简单的情况,我倾向于直接使用这个操作而不是包装在一个函数中:

hello.core> (dosync (some-work @the-ref) (ref-set the-ref 5))
5

在这种情况下,dosync 通常用作您正在寻找的包装器。在 dosync 中 这很重要,因为 dosync 可以很好地与其他事务组合,并使事务的边界可见。如果您处于包装函数可以完全封装对 ref 的所有引用的位置,那么 refs 可能不是最好的工具。

refs 的典型用法看起来更像是这样:

(dosync (some-work @the-ref @the-other-ref) (ref-set the-ref @the-other-ref))

很少需要包装它,因为当使用 ref 时,它们通常以多个 ref 为一组使用,因为手头的问题需要协调的更改。在它们只有一个值的情况下,原子更常见。

关于Clojure 惯用的 get-and-set 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10710704/

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