假设我有一个多重方法:
(defmethod print-method MyObject [obj writer]
(.write writer (format "%s %s"
"prefix"
(original-print-method-placeholder obj writer))我想发出一些分支字符串,然后是如果我没有为这个对象定义print-method的话就会生成的原始字符串。
那么,如何用这个对象作为参数来调用“原始”print-method呢?
发布于 2018-04-30 23:33:35
好的,我从另一个答案中看到,您可能指的是clojure.core/print-method (我以前不知道这一点)。
你可能想看看这个旧帖子:
别忘了读一读等级制度,以防它起作用:
更新
假设您想打印一个关键字。最初的print-method在clojure.core_print.clj中是:
(defmethod print-method clojure.lang.Keyword [o, ^Writer w]
(.write w (str o)))也许只需复制和重命名源,用您自己的defmethod替换原始的(sans作者):
(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)结果:
look:
<kw :hello />通用函数的旧答案:
只需在定义multimethod之前捕获函数:
(def original-print-method-placeholder print-method)
(defmulti print-method ...)
(defmethod print-method ...)
(defmethod print-method ...)
(defmethod print-method ...)是的,这是可行的:
(defn greeting [x] (str "Nice day, " x ))
(greeting "you") => "Nice day, you"但是在后面的文件中,我们重新定义了它:
(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"发布于 2018-05-01 02:37:58
通常,您可以使用(.getMethod print-method :default)来获得默认函数,这样您就可以调用它,尽管clojure.core的print-method会自己调用它,因此最终会出现堆栈溢出。它可能适用于其他多方法,这取决于它们的实现。
如果您想要print-method的默认情况,您可能会发现print-simple非常接近您想要的。(print-method的默认函数称为print-simple。)
https://stackoverflow.com/questions/50109457
复制相似问题