Доступ к вложенным функциям из GUI
Я пытаюсь использовать почти все-в-одном функцию, которая создает GUI и необходимые переменные в основной функции и вложенные функции для использования в качестве действий обратного вызова.
Когда у меня есть
function[]=foo()
A=1;
uicontrol('style','pushbutton','callback','A=bar(A);')
function[OUT]=bar(IN)
OUT=IN+1;
Я получаю ошибку:
Undefined function 'bar' for input arguments of type 'double'.
Error while evaluating uicontrol Callback`
если foo
это сценарий и bar
определяется в bar.m
файл это работает. Мне кажется, что обратные вызовы используют в переменных по умолчанию в рабочем пространстве MATLAB и scripts/fuctions в текущем рабочем каталоге. Как я могу получить доступ к переменным, определенным в вызывающей функции (здесь переменная A
) и функции, вложенные в вызывающую функцию (здесь функция bar
)
1 ответ
Для определения обратных вызовов я нашел самый надежный подход - использовать анонимные функции. Это, как говорится, если bar
является вложенной функцией foo
то он уже имеет доступ к A
и может изменить A
,
function = foo()
A = 1;
uicontrol('style', 'pushbutton', 'callback', @(s,e)bar())
% This is a nested function that already has access to A
function bar()
A = A + 1;
end
% Let's call bar here to demonstrate it updates A
bar();
disp(A);
end
Кроме того, ваши обратные вызовы не могут фактически передавать выходные данные обратно в рабочую область элемента управления, для которого они являются обратным вызовом. Если вы хотите вернуть результат, вам нужно либо: 1) сохранить результат в UserData графического объекта, 2) использовать вложенную подфункцию, как мы показали, либо 3) передать дескриптор объекта пользовательского дескриптора в Перезвоните (classdef object < handle
)