超载! (砰)算子

时间:2016-12-24 13:49:46

标签: matlab operator-overloading

this question的答案中, MathWorks支持团队指出:

  

也有可能超载! (bang)运营商通过创建一个   文件名为“!.m”,并将此文件放在目录之前   MATLAB搜索路径中的$ MATLABROOT \ toolbox \ matlab \ general。

我试过这个,但似乎没有用。我在Linux Mint上运行Matlab 9.1.0.441655(R2016b)。我的路径看起来像这样:

/home/raphael/Programs/Test
/usr/local/MATLAB/R2016b/toolbox/matlab/iofun
...
/usr/local/MATLAB/R2016b/toolbox/matlab/general
...

我在!.m中创建了一个文件/home/raphael/Programs/Test。无论我在此文件中放置什么,编辑器都会显示错误:

Line 1: Unable to run code analysis. '/home/raphael/Programs/Test/!.m' is an invalid file name.

作为! (bang)运算符未列在Operators and associated function list中,不清楚要放在!.m文件中的内容。

尽管如此,我还是尝试了一些代码:

function bang(c)

disp(c)

但是虽然which !返回我的自定义文件路径,但Matlab总是调用内置运算符:

>> which !
/home/raphael/Programs/Test/!.m

>> !pwd
/home/raphael/Programs/Test

将文件重命名为bang.m可解决错误,但对bang操作符没有影响。

所以:

  • 自R2012以来,Matlab的行为是否有所改变?
  • 怎么可能超载! (bang)运营商?
  • 如果这实际上是可能的,那么函数声明的语法应该是什么?

1 个答案:

答案 0 :(得分:5)

看起来这个!.m的未记录处理在R2015b中消失了(可能是随着该版本引入的新执行引擎更改)。

对于早于R2015b的版本,您确实可以在路径上命名文件!.m,然后在文件中的函数名称并不重要(因为它从不在MATLAB中做。)

<强> !.m

function bang(varargin)
    disp('bang!')
end

在当前版本的MATLAB中,!运算符将忽略您的!.m文件,但会调用基础systemunixdos命令。因此,您需要重载这些命令。

所以在OS X上,仅仅unix.m重载就可以了:

<强> unix.m

function varargout = unix(varargin)
    disp('My Unix Command')
    [varargout{1:nargout}] = builtin('unix', varargin{:});
end