Matlab 对于字符串(或句柄)是否引用脚本,是否有内置测试?
下面的函数是一个自行开发的hack,用于检测其参数是否引用脚本Matlab 对于字符串(或句柄)是否引用脚本,是否有内置测试?,matlab,Matlab,下面的函数是一个自行开发的hack,用于检测其参数是否引用脚本 function yesno = is_script(string_or_handle) try nargin(string_or_handle); yesno = false; catch me if ~strcmp(me.identifier, 'MATLAB:nargin:isScript') rethrow(me); en
function yesno = is_script(string_or_handle)
try
nargin(string_or_handle);
yesno = false;
catch me
if ~strcmp(me.identifier, 'MATLAB:nargin:isScript')
rethrow(me);
end
yesno = true;
end
end
这样的黑客很难维护。(例如,每当MathWorks决定更改nargin
在获取脚本作为输入时抛出的异常标识符类时,该异常标识符就会中断。)
MATLAB是否已经有了一个内置函数来实现这一点?您可以通过仅对函数句柄运行
try catch
块来修改您的hack,以减少对未来“中断”的修剪。在本例中,您将知道如果抛出错误,那么输入句柄就是一个脚本(不需要调查错误详细信息;因此对异常标识符不敏感)
MathWorks的Loren早在2013年就对这个问题有了一个明确的认识 她在你的问题中使用了与你相同的方法——值得一提的是,消息标识符是相同的,并且至少三年没有改变过(事实上比这长得多),所以我认为你可以不再担心你的解决方案
有用的是,Loren还添加了一个额外的功能来区分类文件以及函数和脚本。我知道您想要区分脚本和函数。您的方法是否区分脚本和不接受输入的函数?关于
run(哪个(string_或_句柄))
如果不是独立的脚本文件,哪一个会出错?@AndrasDeak True…@LuisMendo:是的,因为nargin
表达式在参数为任何函数时都会计算无误,而与参数的数量无关,因此在这种情况下yesno
将设置为false
isa(string_或_handle,'function_handle')也可以。@AndrasDeak这里的优点是我们知道,nargin
只会在脚本中中断,所以我们不需要包含异常标识符(这可能会在未来的版本中中断)@AndrasDeak作为最后一次更新,我必须添加check vs函数句柄,因为exist(..)
不能将函数句柄作为参数(采用参数类型字符串)。因此,现在,考虑到输入string\u或\u handle
是字符串或句柄,这应该可以工作。(另外:我现在将删除上面的注释以进行清理。感谢反馈!)短路的好用法:)谢谢你的ping,我也清理了。谢谢你的指针!(现在我有点为我的小黑客感到骄傲。)
function yesno = is_script(string_or_handle)
yesno = false;
if isa(string_or_handle,'function_handle') || ...
exist(string_or_handle,'file') == 2
try
nargin(string_or_handle);
catch me
yesno = true;
end
end
end