我试图使用'extend'在Clojure中使用map定义记录方法.以下适用于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))
Run Code Online (Sandbox Code Playgroud)
但是这个版本失败了:
(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)]
Run Code Online (Sandbox Code Playgroud)
第二个版本有什么问题?
正如其他人在对您的代码的评论中指出的那样,您编写的代码在 Clojure 1.4.0 中运行良好(我刚刚自己验证过)。您可能会遇到某种 IDE 配置错误,或者可能存在一些过时的缓存字节码。