Создание дескриптора функции для перегруженной функции `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