【问题标题】:nargin on matlab class method returns -1matlab类方法上的nargin返回-1
【发布时间】:2013-11-09 07:33:52
【问题描述】:

我有以下情况。在 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) 得到正确的结果,但该方法会访问类变量。

【问题讨论】:

标签: matlab oop function-handle


【解决方案1】:

尽管这个问题得到了回答和接受,但我认为值得展示一种可行的方法,即使不创建类的实例也能正常工作。引用元类: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')

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

【讨论】:

    【解决方案2】:

    我无法再验证此答案的有效性。查看更多最近的答案和 cmets。

    原答案

    我通过定义自己的包装器解决了这个问题

    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) 也能做我想做的事

    【讨论】:

    • 您也可以运行nargin(@(x,y,z)@obj.foo),但它给出的“错误”返回值为 3。为什么会这样?因为 MATLAB 分析的是函数句柄而不是后面的函数。因此,您的解决方案并没有真正按预期工作。
    • nargin(@(x)...) 始终返回 1,无论您在 ... 所在的位置放置何种合法语法。这是因为您将参数的数量返回给匿名函数,您将其定义为具有 1 个输入参数。
    • 你一定是对的。如果我还有 Matlab,我会尝试更新答案。至少现在有了更新的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-23
    • 1970-01-01
    • 2015-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多