我试图重载 Octave 中的一些内置函数,以便在调用重载函数的内置版本之前执行自定义操作。在 MATLAB(以及据说是 Octave)中,我可以使用builtin https://www.gnu.org/software/octave/doc/v4.0.1/Overloading-and-Autoloading.html功能。
典型的函数定义如下所示,在执行自定义操作后,我将所有输入/输出转发到内置函数或从内置函数转发所有输入/输出:
function varargout = disp(varargin)
% Do a custom thing
fprintf('Calling overloaded disp!\n')
% Now call the builtin
[varargout{1:nargout}] = builtin('disp', varargin{:});
end
现在如果我放置这个文件(disp.m
)在我的路径上,任何调用的函数disp
将执行我的重载版本,该版本在调用内置函数之前打印出额外的信息disp
功能。
>> disp('hello world')
Calling overloaded disp!
hello world
我遇到的问题是这适用于some内置但不是全部。例如,如果我尝试超载figure
.
function varargout = figure(varargin)
disp('Creating a figure!')
[varargout{1:nargout}] = builtin('figure', varargin{:});
end
当我调用这个的时候,builtin
称为再次重载函数而不是真正的内置。
>> figure()
Creating a figure!
Creating a figure!
Creating a figure!
...
error: max_recursion_depth exceeded
有趣的是,如果我超载figure
作为命令行函数而不是将其保存在figure.m
它的行为完全符合我的预期。
> function varargout = figure(varargin), disp('here'), [varargout{1:nargout}] = builtin('figure', varargin{:}), endfunction
> figure()
here
现在,我在调试时注意到的一件事是,当您有一个与内置函数同名的函数时,Octave(显然)会发出警告。如果您查看警告,您会发现对于函数重载有效和无效的警告,它们略有不同:
警告:函数 ./disp.m 隐藏了内置函数 警告:函数 ./figure.m 隐藏了核心库函数
该文档似乎没有对核心库函数和内置函数进行任何区分,并且文档中没有提到此行为builtin
.
有谁知道导致此行为的原因,并对如何解决此问题有任何建议?