函数调用之间的变量持久化
Variable persisting between function calls
假设我想调用一个函数两次,但我需要函数记住它在第一次调用时初始化的变量,以便在后续调用中更改执行。
例如,如果我有一段这样的代码:
function random
if exist('a','var') == 0
fprintf('hello\n');
a = 1;
else
disp('goodbye\n');
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('hello\n');
a = 1;
else
fprintf('goodbye\n');
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 %i\n',handles.a_flag)
if handles.a_flag == false;
disp('hello\n');
a = 1;
handles.a_flag = true;
else
disp('goodbye\n');
end
guidata(hFigure,handles)
end
end
按两次按钮会在命令中产生以下输出 Window:
Flag is 0
hello\n
Flag is 1
goodbye\n
据我了解,这是 OP 正在寻找的预期行为。
假设我想调用一个函数两次,但我需要函数记住它在第一次调用时初始化的变量,以便在后续调用中更改执行。
例如,如果我有一段这样的代码:
function random
if exist('a','var') == 0
fprintf('hello\n');
a = 1;
else
disp('goodbye\n');
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('hello\n');
a = 1;
else
fprintf('goodbye\n');
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 %i\n',handles.a_flag)
if handles.a_flag == false;
disp('hello\n');
a = 1;
handles.a_flag = true;
else
disp('goodbye\n');
end
guidata(hFigure,handles)
end
end
按两次按钮会在命令中产生以下输出 Window:
Flag is 0
hello\n
Flag is 1
goodbye\n
据我了解,这是 OP 正在寻找的预期行为。