重定义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
相关产品推荐
相关产品推荐

