如何在multimethod内部调用默认实现及原始print-method
嘿,这两个问题在Clojure开发里挺常见的,我来给你一步步讲清楚:
1. 如何在multimethod内部调用默认的multimethod?
在Clojure里,要在自定义的defmethod实现里调用该multimethod的默认逻辑,有两种实用方式:
- 显式触发默认分支:如果你的multimethod是用
:default作为默认分支(这是常规写法),你可以直接调用multimethod本身,传入会触发默认分支的参数。举个例子,假设你的multimethod按:type字段分发:
(defmulti my-multi :type) (defmethod my-multi :default [x] (str "默认处理: " x)) (defmethod my-multi :special [x] (str "特殊处理前置 -> " (my-multi (assoc x :type :default))))
这里在:special的实现里,我们把参数的:type改成:default,就能触发默认分支的逻辑了。
- 直接获取默认方法函数:如果你不想修改参数,可以用
get-method直接拿到默认分支的函数,然后调用它,这样更直接:
(defmethod my-multi :special [x] (str "特殊处理前置 -> " ((get-method my-multi :default) x)))
2. 自定义
print-method时调用原始实现 针对你提到的场景——先输出前缀,再打印原本默认的字符串,关键是拿到print-method针对Object类的实现(因为所有自定义类都继承自Object,默认的打印逻辑就藏在这里)。
修改你的代码如下:
(defmethod print-method MyObject [obj writer] (.write writer "prefix ") ;; 调用原始的默认print-method实现 ((get-method print-method java.lang.Object) obj writer))
这样执行后,会先输出"prefix ",接着输出默认的对象标识(比如#user.MyObject@1a2b3c)。如果你的类原本实现了toString方法,这个写法也能正确触发该方法的逻辑。
内容的提问来源于stack exchange,提问作者Sonicsmooth
相关产品推荐
相关产品推荐

