Доступ к методам и свойствам для классов с перегруженной индексной ссылкой - PullRequest
3 голосов
/ 13 января 2012

Я хочу перегрузить индексирование с помощью () и {} для одного из моих классов MATLAB.Это возможно путем реализации subsref для этого класса, и он отлично работает.

Однако я также хочу сохранить поведение индексации по умолчанию через . (то есть доступ к методами свойства) для этого класса.Я попытался использовать следующий код:

function x = subsref(this, S)
    if strcmp(S(1).type, '{}')
        % My own implementation here
    elseif strcmp(S(1).type, '()')
        % My own implementation here
    elseif strcmp(S(1).type, '.')
        x = builtin('subsref', this, S);
    else
        error('Unknown index variant.');
end

Однако это не работает, потому что я априори не знаю, сколько выходных аргументов вернет вызов builtin('subsref', this, S).В частности, метод моего класса может возвращать переменное число аргументов, причем количество выходных аргументов зависит от количества и значений его входных аргументов.A Пример MATLAB для subsref примечаний:

When you implement a subsref method for a class, you must 
implement all subscripted reference explicitly [...]

Это действительно единственно возможное решение?Для сложных методов это в основном означает дублирование большого количества логики.Это определенно не поддерживается в моем случае (большие классы с большим количеством методов и свойств).

Примечание: я знаю, что это все о синтаксическом сахаре и что я всегда могу использовать стандартные вызовы методов вместо перегрузки () и {}.

1 Ответ

3 голосов
/ 13 января 2012

Для частичного исправления, я думаю, вы можете использовать nargout, чтобы отложить до вызывающего абонента, который обычно будет в состоянии узнать. Любая функция, которая захватывает несколько выходов, должна знать во время вызова, сколько она захватывает.

Это не позволит вам отображать несколько аргументов в командной строке, но должно работать до тех пор, пока вы захватываете возвращенные значения, как в большинстве кода.

function varargout = subsref(this, S)
   switch S(1).type
      ...
      case '.'
         varargout = cell(1, nargout);
         if nargout == 0
             builtin('subsref', this, S);
         else
             [varargout{:}] = builtin('subsref', this, S);
         end
   end
end

Caveat emptor: этот код не тестировался, и в подпрограммах subsref / subsasgn есть куча привередливых краевых случаев.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...