Как получить дескриптор метода в объекте (экземпляр класса) в 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")
будет неопределенным в области видимости функции.