Создание дескриптора функции для перегруженной функции end
MATLAB позволяет перегружать различные операторы для пользовательских классов. Один из не перегруженных списком операторов 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's 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