Nargin для метода класса Matlab возвращает -1

У меня есть следующий сценарий. В 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 ответа

Решение

Я исправил проблему, определив свою собственную оболочку

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), также делает то, что хотел

Несмотря на то, что на этот вопрос ответили и приняли, я думаю, стоит показать рабочий подход, который работает даже без создания экземпляра класса. Ссылка на метакласс: 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')

В последнем примере окончание файла может быть удалено без последствий.

Другие вопросы по тегам