MATLAB 句柄似乎不会同时响应来自同一源的多个通知。不幸的是这对我来说是一个大问题。这是我正在讨论的示例:
classdef testClass < handle
events
testevent
end
methods
function obj = testClass
obj.addlistener('testevent', @obj.respond);
end
function raise(obj)
obj.notify('testevent');
end
function respond(obj, varargin)
fprintf('Responded!\n');
obj.raise();
end
end
end
当我执行代码时
c = testClass;
c.raise();
结果是
Responded!
但我真的希望递归能够工作,尽管显然在这个简单的例子中它会无限递归。有什么办法可以实现这种行为吗?
最佳答案
您可以通过将监听器句柄的 Recursive
属性设置为 true
来使监听器递归。 Listener handle properties are in the event.listener help page 。您只需为 obj.addlistener 指定一个输出参数即可检索句柄。
这是我用来让它工作的代码:
classdef testClass < handle
events
testevent
end
methods
function obj = testClass
lh = obj.addlistener('testevent', @obj.respond);
lh.Recursive = true;
end
function raise(obj)
notify(obj,'testevent');
end
function respond(obj, varargin)
fprintf('Responded!\n');
obj.raise();
end
end
end
另请注意,默认递归限制为 500 次调用,因此代码不会无限递归;使用 set(0, 'RecursionLimit', N)
来更改它。我认为设置 N=inf
是一个坏主意。
关于MATLAB 嵌套事件通知?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7409238/