在Matlab中的模型视图控制器GUI的this示例之后,我有一个关于匿名函数回调输入参数的问题
这是一个视图函数,它创建gui句柄并将它们作为输入参数传递给onChanged回调函数。
function handles = View_TimeDomain(m)
%VIEW a GUI representation of the signal model
% build the GUI
handles = initGUI();
onChangedF(handles, m); % populate with initial values
% observe on model changes and update view accordingly
% (tie listener to model object lifecycle)
addlistener(m, 'f', 'PostSet', ...
@(o,e) onChangedF(handles,e.AffectedObject));
end
我不太明白的第一件事是,根据Matlab文档,第一个参数必须是事件的来源,第二个文件必须是事件数据(Matlab doc1,{{3} })但在这种情况下它是handles
。触发事件时,将按预期调用以下onChangedF函数。
function onChangedF(handles, model)
% respond to model changes by updating view
if ~ishghandle(handles.fig), return, end
set(handles.line, 'XData',model.t, 'YData',model.data)
set(handles.slider, 'Value',model.f);
end
但是,在这种情况下,handle是包含使用initGui()定义的句柄的结构,而不是事件源。
我想这源于匿名函数的定义:
@(o,e) onChangedF(handles, e.AffectedObject)
我是否正确,假设o
是onChangedF
函数输入中未使用的源。有人可以解释为什么匿名函数的这种语法有效吗?
我认为o
也需要成为这个特定回调函数的参数。像这样:
@(o,e) onChangedF(o, handles, e.AffectedObject)
其中附加参数(在结尾处)。 然后使用〜:
来避免这个未使用的参数function onChangedF(~, handles, model)
% respond to model changes by updating view
if ~ishghandle(handles.fig), return, end
set(handles.line, 'XData',model.t, 'YData',model.data)
set(handles.slider, 'Value',model.f);
end
答案 0 :(得分:1)
Anonymous functions是function handles的子集,允许您完全定义内联函数,而不是执行其他地方存在的函数的函数句柄。
匿名函数的语法是af = @(arglist)anonymous_function
,其功能与:
function af(arglist)
anonymous_function
end
这意味着您的PostSet
回调在功能上等同于:
function PostSet(o,e)
onChangedF(handles, e.AffectedObject)
end
满足MATLAB的callback definition要求。
因为handles
在您创建PostSet
匿名函数时位于函数范围内,所以它也可以在匿名函数回调的范围内使用。这在匿名函数文档的'Variables in the Expression'部分中进行了解释。这也可以使用functions
函数进行可视化,该函数提供有关函数句柄的信息:
z = 50;
fh = @(x, y) thing(y, z);
fhinfo = functions(fh);
fhworkspace = fhinfo.workspace{1}
返回:
fhworkspace =
struct with fields:
z: 50