我正在尝试实现一个可以在 Matlab 中用作实例计数器的列表。我希望这个列表是静态的。
到目前为止,matlab 中还没有 static 关键字,但它们提供了一种几乎可以完成这项工作的模式:
声明一个继承句柄的类List:
classdef List < handle
properties (Access = private)
cellRepresentingAList = {};
end
..... %Implement any functions
end
然后您可以通过以下方式使用它:
classdef MyClassUsingAList < handle
properties (Constant, Access = private)
myListOfStuff = List();
end
.....
end
我们使用句柄对象作为常量的事实导致 MyClassUsingAList 的每个实例都将使用相同的对象句柄,也就是我有一个静态列表。
一切都工作得很好,直到我遇到异常。或者我使用“停止调试”按钮进行调试并停止调试,或者保存。此刻,该列表已清除。空。
这不是我可以投入生产的东西。
Matlab 提供了持久变量,它在函数中起到静态变量的作用,但不可能在类中使用它们(除非您在使用列表的每个方法中都使用关键字“持久”)。
有没有可靠的方法可以实现这个目标?
谢谢
最佳答案
使用 persistent
关键字,如所述 here 。 (你选择了第二种方法,我认为你需要的是这个)。如果发生类似您使用 mlock
命令描述的情况,您可以锁定函数,以免意外清除。
请注意,您不必必须按照您所说的在每个方法中定义持久变量! (事实上,这可能会产生与您想要的相反的效果,因为持久变量对于每个函数都是唯一的,而不是对于整个类来说是唯一的)。只需创建一个具有静态访问的单个方法,其全部目的是保留该持久变量的副本,并在需要获取或设置它的任何其他非静态方法中引用该方法。
例如
classdef myclass
properties
Prop1;
Prop2;
end
methods(Static, Access='public')
function Out = StaticVar1(In) % first static "variable"
mlock
persistent var;
if isempty(var); var = 0; end % initial value
if nargin < 1; Out = var; return; end % get value
var = In; % set value
end
function Out = StaticVar2(In) % second static "variable"
mlock
persistent var;
if isempty(var); var = 0; end % initial value
if nargin < 1; Out = var; return; end % get value
var = In; % set value
end
end
methods
function Out = addStaticVars(o)
Out = o.StaticVar1 + o.StaticVar2;
end
end
end
使用示例:
>> a = myclass();
>> myclass.StaticVar1 % access the first static "variable"
ans =
0
>> myclass.StaticVar2 % access the second static "variable"
ans =
0
>> myclass.StaticVar1(10) % set static "variable" to 10
>> myclass.StaticVar2(20) % set static "variable" to 20
>> a.addStaticVars()
ans =
30
>> b = myclass();
>> b.addStaticVars()
ans =
30
>> clear all; % inneffective as functions are "locked"
>> myclass.StaticVar1
ans =
10
>> munlock myclass.StaticVar1
>> clear all; % this will now succeed in clearing the static "variable"
>> myclass.StaticVar1
ans =
0
关于Matlab:静态类成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39171576/