gpt4 book ai didi

clojure - Clojure deftype 中的可变字段?

转载 作者:行者123 更新时间:2023-12-02 05:20:22 25 4
gpt4 key购买 nike

我正在尝试 Clojure 1.2,特别是根据 clojure.org documentationdeftype 中支持的可变字段。 。

但我无法让该装置工作。更新字段的语法是什么?或者可变性尚未实现?

(definterface IPoint
(getX [])
(setX [v]))

(deftype Point [x]
IPoint
(getX [this] x)
(setX [this v] (set! (.x this) v)))

user=> (def p (Point. 10))
user=> (.getX p)
10
user=> (.setX p 20)
ClassCastException: user.Point cannot be cast to compile__stub.user.Point

使用几天前的 1.2 快照。

最佳答案

deftype 的默认值仍然是字段不可变;要覆盖它,您需要使用适当的元数据注释可变字段的名称。此外,实例字段的 set! 语法也不同。实现上述工作的示例实现:

(deftype Point [^{:volatile-mutable true} x]
IPoint
(getX [_] x)
(setX [this v] (set! x v)))

还有:unsynchronized-mutable。区别正如经验丰富的 Java 开发人员从名称中所暗示的那样。 ;-) 请注意,提供任一注释都会产生使字段私有(private)的额外效果,因此不再可能直接访问字段:

(.getX (Point. 10)) ; still works
(.x (Point. 10)) ; with annotations -- IllegalArgumentException, works without

此外,1.2 可能会支持语法 ^:volatile-mutable x 作为 ^{:volatile-mutable true} x 的简写(这在某些版本上已经可用)新的数字分支)。

(doc deftype) 中提到了这两个选项;相关部分如下——请注意警告!

Fields can be qualified with the metadata :volatile-mutable true or :unsynchronized-mutable true, at which point (set! afield aval) will be supported in method bodies. Note well that mutable fields are extremely difficult to use correctly, and are present only to facilitate the building of higher level constructs, such as Clojure's reference types, in Clojure itself. They are for experts only - if the semantics and implications of :volatile-mutable or :unsynchronized-mutable are not immediately apparent to you, you should not be using them.

关于clojure - Clojure deftype 中的可变字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3132931/

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