首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Clojure deftype中的可变字段?

Clojure deftype中的可变字段?
EN

Stack Overflow用户
提问于 2010-06-28 21:52:43
回答 2查看 7.1K关注 0票数 21

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

但是我不能让布景正常工作。更新字段的语法是什么?或者还没有实现可变性?

代码语言:javascript
复制
(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快照。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-06-28 23:16:52

deftype的默认设置仍然是字段是不可变的;要覆盖这一点,您需要使用适当的元数据注释可变字段的名称。此外,set! of instance字段的语法也不同。上面的实现示例如下:

代码语言:javascript
复制
(deftype Point [^{:volatile-mutable true} x]
  IPoint
  (getX [_] x)
  (setX [this v] (set! x v)))

还有:unsynchronized-mutable。区别就像名字对经验丰富的Java开发人员所暗示的那样。;-)请注意,提供任何一个注释都有额外的效果,即使字段成为私有字段,因此不再可能直接访问字段:

代码语言:javascript
复制
(.getX (Point. 10)) ; still works
(.x (Point. 10))    ; with annotations -- IllegalArgumentException, works without

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

这两种选择在(doc deftype)中都有提到;下面是相关的部分--注意警告!

字段可以使用元数据进行限定:易失性-可变真或:不同步-可变真,在这一点(设置!afield aval)将在方法体中得到支持。请注意,可变字段很难正确使用,出现这些字段只是为了便于在Clojure中构建更高级别的构造,比如Clojure的引用类型。它们仅供专家使用-如果:volatile-mutable或:unsynchronized mutable的语义和含义对您不是很明显,那么您就不应该使用它们。

票数 43
EN

Stack Overflow用户

发布于 2019-03-28 05:38:30

像Clojure中的大多数东西一样,通过deftype定义的类型中的字段是不可变的。虽然您可以使用:volatile-mutable / :unsynchronized-mutable注释来规避这一点,但这样做并不常见。首先,这样的注解将使字段成为私有字段,因此只有定义在类型上的方法才能访问(并因此设置)它。但更重要的是,这样的结构容易受到数据竞争的影响。

当需要可变性时,is Clojure将使用Clojure的引用类型之一,如atomref

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3132931

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档