matlab类方法中的nargin返回-1

时间:2013-11-09 07:33:53

标签: matlab oop function-handle

我有以下情况。在 myClass.m 中我定义了

classdef myClass
    ...
    methods
        function y = foo(this, x)
            ...
        end
    end
end

然后我执行

obj = myClass();
nargin(@obj.foo)

并得到结果-1,而我期望1.尽管如此,该函数只接受一个参数。 我实际上想把句柄传递给另一个函数(我没有访问权限),它检查参数的数量,我希望检查nargin(f)== 1成功。有没有办法做到这一点?

PS 我知道如果我将方法定义为静态,我将通过调用nargin(@(x)Test.foo)来获得正确的结果,但该方法访问类变量。

2 个答案:

答案 0 :(得分:2)

即使这个问题得到了回答和接受,我还是认为有必要展示一种可行的方法,即使没有创建该类的实例,该方法也可以工作。对元类的引用:https://ch.mathworks.com/help/matlab/ref/metaclass.html

metaClass = ?myClass
numArgIn = zeros(length(metaClass.MethodList), 1);
names = strings(length(metaClass.MethodList), 1);
for i=1:length(metaClass.MethodList)
    names(i) = string(metaClass.MethodList(i).Name);
    numArgIn(i) = numel(metaClass.MethodList(i).InputNames);
end
disp(numArgIn(names=="foo"))

使用类和某些模块创建文件夹时,可以使用以下单线表示法:

nargin('@myClass/foo.m')

在后一个示例中,文件结尾可以删除而没有效果。

答案 1 :(得分:1)

我通过定义自己的包装器来修复问题,比如

function y = mywrapper(f, x)
%MYWRAPPER nargin(@(x)mywrapper(f, x)) is 1 as it should be
y = f(x);

end

<强>更新 我意识到nargin(@(x)@ obj.foo),也做了我想要的事情