我正在尝试实现一个列表,该列表可以在Matlab中用作实例计数器。我希望这个清单是静态的。
到目前为止,matlab中没有静态关键字,但它们提供的模式几乎可以完成这项工作:
声明一个继承句柄的类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')。
有没有可靠的方法来实现这一目标?
由于
答案 0 :(得分:1)
使用persistent
关键字,如here所述。 (你选择了第二种方法,我认为你需要的是这个方法)。如果使用mlock
命令描述的内容,您可以锁定意外清除的功能。
请注意,如你所说,不必须在每个方法中定义一个持久变量! (事实上,这可能会产生与你想要的相反的效果,因为持久变量对于每个函数是唯一的,而不是作为整体的类)。只需使用静态访问创建一个方法,其唯一的目的是保留该持久变量的副本,并在需要获取或设置它的任何其他非静态方法中引用该方法。
E.g。
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