我正在尝试Clojure1.2,特别是根据clojure.org documentation在deftype中支持的可变字段。
但是我不能让布景正常工作。更新字段的语法是什么?或者还没有实现可变性?
(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快照。
发布于 2010-06-28 23:16:52
deftype的默认设置仍然是字段是不可变的;要覆盖这一点,您需要使用适当的元数据注释可变字段的名称。此外,set! of instance字段的语法也不同。上面的实现示例如下:
(deftype Point [^{:volatile-mutable true} x]
IPoint
(getX [_] x)
(setX [this v] (set! x v)))还有:unsynchronized-mutable。区别就像名字对经验丰富的Java开发人员所暗示的那样。;-)请注意,提供任何一个注释都有额外的效果,即使字段成为私有字段,因此不再可能直接访问字段:
(.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的语义和含义对您不是很明显,那么您就不应该使用它们。
https://stackoverflow.com/questions/3132931
复制相似问题