Как получить дескриптор метода в объекте (экземпляр класса) в MATLAB

Я пытаюсь получить дескриптор метода изнутри объекта в MATLAB, но что-то вроде str2func('obj.MethodName') не работает

3 ответа

Можно также написать

fstr = 'say';
obj.(fstr)();

Это имеет то преимущество, что не требует, чтобы класс дескриптора работал, если объект (obj) изменен.

Ответ заключается в том, чтобы получить дескриптор функции, как показало @Pablo.

Обратите внимание, что ваш класс должен быть получен из handle класс для правильной работы (чтобы объект передавался по ссылке).

Рассмотрим следующий пример:

hello.m

classdef hello < handle
    properties
        name = '';
    end
    methods
        function this = hello()
            this.name = 'world';
        end
        function say(this)
            fprintf('Hello %s!\n', this.name);
        end
    end
end

Теперь мы получаем дескриптор функции-члена и используем ее:

obj = hello();         %# create object
f = @obj.say;          %# get handle to function

obj.name = 'there';    %# change object state

obj.say()
f()

Выход:

Hello there!
Hello there!

Однако если мы определим его как класс значений вместо (измените первую строку на classdef hello), результат будет другим:

Hello there!
Hello world!

Использование @, У меня работает следующий код:

f = @obj.MethodName

Никакой другой ответ не имитирует str2func('obj.MethodName'). На самом деле, этого тоже нет, не совсем так. Но вы можете определить вспомогательную функцию так:

function handle = method_handle(obj, mstr)
    handle = @(varargin) obj.(mstr)(varargin{:});
end

потом method_handle(obj, 'MethodName') возвращает дескриптор obj.MethodName. К сожалению, вы не можете передать имя переменнойobj как строка - eval("obj") будет неопределенным в области видимости функции.

Другие вопросы по тегам