Matlab 对于字符串(或句柄)是否引用脚本,是否有内置测试?

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

下面的函数是一个自行开发的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);
        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