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')
В последнем примере окончание файла может быть удалено без последствий.