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

欢迎!有关如何使用此功能,请参阅关于 页面以了解更多信息。

0
Clojure

应完全禁止关闭对可变字段的操作(并生成编译器异常),而不仅仅是尝试使用 set! 操作。由于可变字段的更改不会传播到被关闭的字段中,这可能导致意外的错误。

`
(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 汇报)
...