函数调用之间的变量持久化



假设我想调用一个函数两次,但我需要函数记住第一次调用时初始化的变量,以便在后续调用中更改执行。

例如,如果我有一段这样的代码:

function random
if exist('a','var') == 0
fprintf('hellon');
a = 1;
else 
disp('goodbyen');
end
end  

当我再次调用代码时,如何让MATLAB记住a等于1?具体来说,我希望在我正在编写的程序中使用这个按钮回调函数。

MATLAB支持关键字persistent,您可以按如下方式使用它:

function toggleval_persist
% Set up the persistent variable and initialize it.
persistent a;
if isempty(a)
a = 0;
end      
if ( a == 0 ) 
disp('hello');
a = 1;
else
a = 0; 
disp('goodbye');
end
end 

此外,我不建议使用持久变量来切换按钮状态。如果您使用MATLAB的UI系统,按钮的状态通常在GUI的对象结构中可用。

您可以(在GUI中使用此代码)设置一个标志,告知a是否已初始化,并将其作为参数传递给函数random。例如,将标志(我们称之为a_flag)存储在GUI的句柄结构中,可以让您跟踪其值(实际上存储在handles.a_flag中)。

换句话说,您可以在创建GUI期间(或者如果您使用GUIDE,则在其Opening_Fcn中)将标志设置为0,如下所示:

handles.a_flag = false;

然后在名为random的函数中,您可以使用:random(handles.a_flag):调用该函数

function random(a_flag)
if ~a_flag
%// Update the flag
a_flag = true;
fprintf('hellon');
a = 1;
else 
fprintf('goodbyen');
end
end

更简单的方法是使用全局变量。。。但我更喜欢这个主意:)

编辑

我的代码的重点是演示我们可以使用GUI的句柄结构(按照OP的要求)来存储标志的值。由于每次回调都可以访问该结构,因此按下按钮将以与持久变量相同的方式更新该结构。

请尝试这个代码看看我的意思:

function TestGUI
clear
clc
hFigure = figure('Position',[200 200 200 150]);
handles.Disp_a_title = uicontrol('Style','text','String','a','Position',[20 100 60 20]);
handles.Disp_aflag = uicontrol('Style','text','String','0','Position',[100 100 60 20]);
handles.Button = uicontrol('Style','Push','Position',[50 50 60 20],'String','Update a','Callback',@(s,e) PushCb);
a = 0;
handles.a_flag = false;
guidata(hFigure,handles)
function PushCb(~,~)

handles = guidata(hFigure);
fprintf('Flag is %in',handles.a_flag)

if handles.a_flag == false;
disp('hellon');
a = 1;
handles.a_flag = true;
else
disp('goodbyen');
end
guidata(hFigure,handles)
end
end

按下两次按钮会在命令窗口中产生以下输出:

Flag is 0
hellon
Flag is 1
goodbyen

据我所知,这是OP正在寻找的预期行为。

最新更新