Создание дескриптора функции для перегруженной функции `end`
MATLAB позволяет перегружать различные operators для пользовательских классов. Один из неуправляемых перегружаемых операторов - end
, что можно узнать из \matlab\lang\end.m
:
% END(A,K,N) is called for indexing expressions involving the object A
% when END is part of the K-th index out of N indices. For example,
% the expression A(end-1,:) calls A END method with END(A,1,2).
Примером такого метода является table.end
(вставьте в командную строку MATLAB и нажмите "Открыть выбор", чтобы перейти к его определению, он определен в ...\matlab\datatypes\@tabular\end.m
).
В отличие от обычного метода нельзя просто написать hEnd = @end
, потому что это дает ошибку:
>> hEnd = @end;
hEnd = @end;
↑
Error: Illegal use of reserved keyword "end".
С другой стороны, запись e = str2func('end');
работает, но она ссылается на функцию по умолчанию end
(даже при временном переходе в папку, где найден желаемый end.m
).
Неудачные попытки включают str2func('table>end');
, str2func('table\end');
, str2func('table.end');
и @(a,b,c)table.end(a,b,c);
.
Мой вопрос: Как создать дескриптор функции end
для определенного класса?
Ответы
Ответ 1
Перегрузка - если указанная вами функция перегружает функцию в классе, который не является фундаментальным классом MATLAB, функция не связана с дескриптором функции в момент его создания. Вместо этого MATLAB рассматривает входные аргументы и определяет, какую реализацию вызывать во время оценки.
Обработчики функций сохраняют свой абсолютный путь, поэтому, когда у вас есть действительный дескриптор, вы можете вызывать функцию из любого места. Вам не нужно указывать путь к функции при создании дескриптора, только имя функции.
поэтому, если ваша функция "end" находится в пути matlab, matlab рассматривает ее как кандидата для оценки в зависимости от входов, в вашем случае, если входной объект имеет тип класса "table", feval (str2func ('end'), i, j) оценить конечную функцию, которая определена в папке @table/end.m