Обработка неопределенных методов в Matlab путем передачи имени метода и входных данных в функцию / метод - PullRequest
2 голосов
/ 02 апреля 2020

Предположим, у нас есть класс Matlab с именем MyClas, как показано ниже,

classdef MyClass
   properties
      Value
   end
   methods
      function foo(input1, input2)
          ...
      end
   end
end

То, что я ищу, имеет MyClass.anyThing(inputValue), где anyThing и inputValue - произвольные строки, а anyThing не является определенным методом в MyClass, передает anyThing и inputValue как две строки моей функции foo.

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

Мне трудно разобраться в моей проблеме, так как я не знаю, есть ли какой-либо технический термин для того, кто я пытаясь снять здесь. Тем не менее, мне удалось найти эту ссылку из математических работ , которая просто настраивает операции индексирования и точно не решает мою проблему.

1 Ответ

2 голосов
/ 03 апреля 2020

Вы можете эмулировать это, взломав реализацию subsref. Например:

classdef MethodRedirector
    methods
        function varargout = subsref(obj, S)
            if numel(S) == 2 && strcmp(S(1).type, '.') && ...
                    strcmp(S(2).type, '()')
                % Looks like obj.method(args)
                fprintf('In method invocation to: %s with args:\n', S(1).subs);
                celldisp(S(2).subs);
            else
                [varargout{1:nargout}] = builtin('subsref', obj, S);
            end
        end
    end
end

Ограничение заключается в том, что вызывающие абоненты должны использовать синтаксис obj.method(args...) и не могут использовать (обычно эквивалентный) синтаксис method(obj, args...).

Вот как это выглядит на практике :

>> mr = MethodRedirector; mr.someMethod(1, '2', magic(3))
In method invocation to: someMethod with args:
ans{1} =
     1
ans{2} =
2
ans{3} =
     8     1     6
     3     5     7
     4     9     2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...