我正在尝试使用deftype在Clojure中创建一个新类型,以实现一个二维(x,y)坐标,并实现“位置”协议。
我还希望这个类型实现标准的Java equals,hashCode和toString方法。
我的初始尝试是:
(defprotocol Location
(get-x [p])
(get-y [p])
(add [p q]))
(deftype Point [#^Integer x #^Integer y]
Location
(get-x [p] x)
(get-y [p] y)
(add [p q]
(let [x2 (get-x q)
y2 (get-y q)]
(Point. (+ x x2) (+ y y2))))
Object
(toString [self] (str "(" x "," y ")"))
(hashCode [self] (unchecked-add x (Integer/rotateRight y 16)))
(equals [self b]
(and
(XXXinstanceofXXX Location b)
(= x (get-x b))
(= y (get-y b)))))
然而,equals方法仍需要一些方法来确定b参数是否实现了Location协议。
什么是正确的方法?我走在正确的轨道上吗?
deftype
似乎用于实现Clojure本身的一些部分,或者实现自己的新的抽象数据类型。而defrecord
似乎用于“数据”,即您的Points或其他旨在高级别上使用的数据。如果您可以轻松地将您的类型替换为哈希图(在您的情况下我认为是可能的),那么defrecord
可能是您想要的。这只是我的理解。 - Brian Carper