6

我正在尝试使用“扩展”在 Clojure 中使用地图定义记录方法。以下适用于 Clojure 1.4.0:

(defprotocol PointMethods
  (add [self other])
  (distance [self]))

(defrecord Point [x y]
  PointMethods
  (add [self other]
    (Point. (+ (:x self) (:x other)) (+ (:y self) (:y other))))
  (distance [self]
    (Math/sqrt (+ (* (:x self) (:x self)) (* (:y self) (:y self))))))

(def p1 (Point. 2 3))
(def p2 (Point. 1 1))

(def p3 (add p1 p2))
(println p3)
(println (distance p3))

但是这个版本失败了:

(defprotocol PointMethods
  (add [self other])
  (distance [self]))

(defrecord Point [x y])
(extend Point
  PointMethods
  {:add
   (fn [self other] (Point. (+ (:x self) (:x other)) (+ (:y self) (:y other))))
   :distance
   (fn [self] (Math/sqrt (+ (* (:x self) (:x self)) (* (:y self) (:y self)))))})

(def p1 (Point. 2 3))
(def p2 (Point. 1 1))

(def p3 (add p1 p2))
(println p3)
(println (distance p3))

Clojure Compiler: java.lang.IllegalArgumentException: No implementation of method: :add 
of protocol: #'user/PointMethods found for class: user.Point, compiling:(records.clj:16)]

第二个版本有什么问题?

4

1 回答 1

0

正如其他人在对您的代码的评论中指出的那样,您编写的代码在 Clojure 1.4.0 中运行良好(我自己验证了它)。您可能会遇到某种 IDE 错误配置,或者可能存在一些过时的缓存字节码。

于 2018-04-27T11:49:18.257 回答