我有以下情况。在 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)
来获得正确的结果,但该方法访问类变量。
答案 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),也做了我想要的事情