请在2024年Clojure状态调查!中分享您的想法。

欢迎!请查看关于页面,了解有关如何使用此网站的更多信息。

0
Clojure

应完全禁止对可变字段的引用(并生成编译器异常),而不仅仅是设置它们。因为可变字段的变化不会传播到封闭的值中,这会导致令人意外的错误

`
(defprotocol P
(-set [this])
(-get [this])
(-get-fn [this]))

(deftype T [^:unsynchronized-mutable val]
P
(-set [this] (set! val :bar))
(-get [this] val)
(-get-fn [this] (fn [] val)))

(def x (->T :foo))

(def xf (-get-fn x))

user> (-set x)
:bar
user> (-get x)
:bar
user> (xf)
:foo ;; 应该是 :bar !!!
`

4个答案

0

评论者:wagjo

相关问题CLJ-274

0

评论者:gshayban

在给定的示例中,排序发生在set!之前,因此闭包获取的值不是可赋值的容器。这与其他语言保持一致(按值传递,而不是按可变容器传递)

0

评论者:wagjo

感谢您的解释。这个票据是关于一个提议,即修改可变字段应该在抛出错误时结束,而不应该在一个值上结束。如果需要值,必须使用显式的let绑定。到目前为止,我还没有找到有效的用例,其中关闭可变字段并获取封闭的值是预期的和希望的行为。

0
参考: https://clojure.atlassian.net/browse/CLJ-1560(由wagjo报告)
...