You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:55:23