首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Clojure / Clojurescript中重用deftype方法?

如何在Clojure / Clojurescript中重用deftype方法?
EN

Stack Overflow用户
提问于 2015-08-23 20:28:54
回答 1查看 498关注 0票数 6

我正在尝试扩展库DomKM/丝绸

具体来说,有deftype Route实现了协议Pattern,它有方法实现,我想在自定义的Pattern协议实现中重用它。

https://github.com/DomKM/silk/blob/master/src/domkm/silk.cljx#L355

代码语言:javascript
复制
(deftype Route [name pattern]
  Pattern
  (-match [this -url]
          (when-let [params (match pattern (url -url))]
            (assoc params ::name name ::pattern pattern)))
  (-unmatch [this params]
            (->> (dissoc params ::name ::pattern)
                 (unmatch pattern)
                 url))
  (-match-validator [_]
                    map?)
  (-unmatch-validators [_]
                       {}))

好的,所以我的实现看起来是这样的,但是我想“继承”Route的方法,我的意思是先执行一些自定义逻辑,然后将它传递给原始的Route方法。

代码语言:javascript
复制
(deftype MyRoute [name pattern]
  silk/Pattern
  (-match [this -url] 
    true) ;match logic here
  (-unmatch [this {nm ::name :as params}]
    true) ;unmatch logic here
  (-match-validator [_] map?)
  (-unmatch-validators [_] {}))

如何在clojure / clojurescript中做到这一点?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-22 19:41:31

没有必要对这种类型进行推敲。引用“祖先”协议实现是可能的,从另一个名称空间。

代码语言:javascript
复制
user=> (ns ns1)
nil
ns1=> (defprotocol P (f [o]))
P
ns1=> (deftype T [] P (f [_] 1))
ns1.T
ns1=> (f (T.))
1
ns1=> (ns ns2)
nil
ns2=> (defprotocol P (f [o]))
P
ns2=> (extend-protocol P ns1.T (f [o] (+ 1 (ns1/f o))))
nil
ns2=> (f (ns1.T.))
2

请记住,ns1.Pns2.P是完全不同的猫,两者都叫P

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32171193

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档