首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从multimethod内部调用默认multimethod

如何从multimethod内部调用默认multimethod
EN

Stack Overflow用户
提问于 2018-04-30 23:20:40
回答 2查看 476关注 0票数 2

假设我有一个多重方法:

代码语言:javascript
复制
(defmethod print-method MyObject [obj writer] 
    (.write writer (format "%s %s" 
                           "prefix" 
                           (original-print-method-placeholder obj writer))

我想发出一些分支字符串,然后是如果我没有为这个对象定义print-method的话就会生成的原始字符串。

那么,如何用这个对象作为参数来调用“原始”print-method呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-04-30 23:33:35

好的,我从另一个答案中看到,您可能指的是clojure.core/print-method (我以前不知道这一点)。

你可能想看看这个旧帖子:

别忘了读一读等级制度,以防它起作用:

更新

假设您想打印一个关键字。最初的print-methodclojure.core_print.clj中是:

代码语言:javascript
复制
(defmethod print-method clojure.lang.Keyword [o, ^Writer w]
  (.write w (str o)))

也许只需复制和重命名源,用您自己的defmethod替换原始的(sans作者):

代码语言:javascript
复制
(defn print-method-kw [o]
  (str o))

(defmethod print-method clojure.lang.Keyword [o, w]
  (.write w (str "<kw " (print-method-kw o) " />")))

(println "look:")
(println :hello)

结果:

代码语言:javascript
复制
look:
<kw :hello />

通用函数的旧答案:

只需在定义multimethod之前捕获函数:

代码语言:javascript
复制
(def original-print-method-placeholder print-method)

(defmulti print-method ...)
(defmethod print-method ...)
(defmethod print-method ...)
(defmethod print-method ...)

是的,这是可行的:

代码语言:javascript
复制
(defn greeting [x] (str "Nice day, " x ))

(greeting "you") => "Nice day, you"

但是在后面的文件中,我们重新定义了它:

代码语言:javascript
复制
(def orig-greeting greeting)  ; capture a reference to the function

(defmulti  greeting (fn [lang & args] lang))
(defmethod greeting :english [lang person]
  (str "(English accent) " (orig-greeting person)))
(defmethod greeting :french [lang person]
  (str "(French accent) " (orig-greeting person)))

(greeting :english "you")  => "(English accent) Nice day, you"
(greeting :french "you")   => "(French accent) Nice day, you"
票数 1
EN

Stack Overflow用户

发布于 2018-05-01 02:37:58

通常,您可以使用(.getMethod print-method :default)来获得默认函数,这样您就可以调用它,尽管clojure.coreprint-method会自己调用它,因此最终会出现堆栈溢出。它可能适用于其他多方法,这取决于它们的实现。

如果您想要print-method的默认情况,您可能会发现print-simple非常接近您想要的。(print-method的默认函数称为print-simple。)

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

https://stackoverflow.com/questions/50109457

复制
相关文章

相似问题

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