实现重载算术量协议方法的格式在不同的 "extend-" 宏和 "defrecord" 之间不一致。
"extend" 宏系列要求重载方法定义遵循 defn 格式。
(method ([arg1] ...) ([arg1 arg2] ...))
然而,"defrecord" 要求单独定义实现。
(method [arg1] ...) (method [arg1 arg2] ...)
此外,错误模式如果你搞错了是无用的。
如果你使用 "defrecord" 形式与 "extend-",它将成功评估,但后来的定义静默地覆盖词法先前的定义。
如果你使用 "extend-" 形式与 "defrecord",它会在方法体上出现关于 "不支持的绑定形式" 的神秘错误。
这不是与 CLJ-1056 相同的问题:后者与声明协议的语法有关,这个问题是与 实现协议 语法有关。
`
(defprotocol MyProtocol
(mymethod
[this arg]
[this arg optional-arg]))
(extend-protocol MyProtocol
Object
(mymethod
([this arg] :one-arg)
([this arg optional-arg] :two-args)))
;; 错误!会崩溃:"不支持的绑定形式::one-arg"
(defrecord MyRecord []
MyProtocol
(mymethod
([this arg] :one-arg)
([this arg optional-arg] :two-args)))
;; 工作正常...
(defrecord MyRecord []
MyProtocol
(mymethod [this arg] :one-arg)
(mymethod [this arg optional-arg] :two-args))
;; 评估...
(extend-protocol MyProtocol
Object
(mymethod [this arg] :one-arg)
(mymethod [this arg optional-arg] :two-args))
;; 然后出错!"参数数量错误"
(mymethod :obj :arg)
;; 两参数版本可调用...
(mymethod :obj :arg1 :arg2)
`