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

重定义Plot.save函数后,如何在新定义中调用原函数?

背景

在项目中会生成各类图表及其他二进制文件,由于这类文件体积较大,希望在不纳入Git版本控制的前提下检测文件变更,计划通过添加存储校验和的伴随文件并仅追踪该伴随文件来实现。

示例

假设使用虚构的Plot包,它提供了save(filename::String, fig::Figure)函数。目标是重定义Plot.save函数,使其额外保存一个仅包含校验和的伴随文件,但当前代码会触发无限递归:

using Plot

function Plot.save(filename::String, fig::Figure)
    write(filename * ".chksum", string(hash(fig)))
    Plot.save(filename, fig) # <- 问题:该行会导致无限递归,需要调用原定义
end

问题

如何在新定义的Plot.save函数中调用原始的Plot.save函数,是否有可行的实现方法?

解决方案

方法1:提前保存原函数引用

在重定义Plot.save之前,先将原始函数赋值给一个变量,后续在新函数中调用该变量即可避免递归:

using Plot

# 保存原始save函数的引用
original_save = Plot.save

function Plot.save(filename::String, fig::Figure)
    write(filename * ".chksum", string(hash(fig)))
    # 调用原始函数
    original_save(filename, fig)
end

方法2:使用Base.invoke指定调用原方法

如果存在多个方法重载的情况,Base.invoke可以精准指定要调用的原始方法签名:

using Plot

function Plot.save(filename::String, fig::Figure)
    write(filename * ".chksum", string(hash(fig)))
    # 明确指定原始方法的参数类型来调用
    Base.invoke(Plot.save, Tuple{String, Figure}, filename, fig)
end

内容的提问来源于stack exchange,提问作者Picaud Vincent

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 07:53:13