如何在 Matlab 中定义和访问静态属性作为顶级成员?
How to define and access to static properties as a top-level member in Matlab?
我想在具有简单访问权限的 class 中有一个简单的 static
成员,即我喜欢 class_name.static_data
而不是 class_name.shared_obj.static_data
。
我搜索并找到 standard method of defining static members in Matlab
classes, on mathwork.com as you can see below.
classdef SharedData < handle % an auxiliary class to keep static data
properties
Data1
Data2
end
end
classdef UseData % main class
properties (Constant)
Data = SharedData
end
% Class code here
end
然后我们可以像这样使用它:
k = UseData
k.Data.Data1=5; % Want to be `k.Data1=5;` instead.
但我希望有一个顶级 static
成员
( 类似于
obj_of_UseData.Data1=5;
没有
obj_of_UseData.Data.Data1=5;
)
(即像顶级会员,而不是二级会员)。我寻求一种方法来实现顶级 static
成员,而不是二级成员。
谢谢
可以遵循 the advice from the MathWorks related to static data,并仍然创建使这些变量看起来像是成员的行为。您可以通过重载 subsref
和 subsasgn
方法来实现,如下所示。此代码使用创建静态数据的静态方法方式,因为它最简单,但思想转化为另一种方法,也使用句柄 class。
classdef UseData
properties
Data3
end
methods (Static)
function out = setgetVar(name,value)
persistent data;
if isempty(data)
data = struct('Data1',[],'Data2',[]);
end
if nargin==2
data.(name) = value;
end
out = data.(name);
end
end
methods
function obj = subsref(obj,S)
if isequal(S(1).type,'.')
if strcmp(S(1).subs,'Data1') || strcmp(S(1).subs,'Data2')
obj = UseData.setgetVar(S(1).subs);
return
end
end
obj = builtin('subsref',obj,S);
end
function obj = subsasgn(obj,S,value)
if isequal(S(1).type,'.')
if strcmp(S(1).subs,'Data1') || strcmp(S(1).subs,'Data2')
UseData.setgetVar(S(1).subs,value);
return
end
end
obj = builtin('subsasgn',obj,S,value);
end
end
end
要查看它的工作情况:
>> x = UseData;
>> y = UseData;
>> x.Data1 = 'bla';
>> y.Data2 = [5,6];
>> x.Data3 = 0;
>> y.Data3 = 10;
>> y.Data1
ans = bla
>> x.Data2
ans =
5 6
>> x.Data3
ans = 0
>> y.Data3
ans = 10
我想在具有简单访问权限的 class 中有一个简单的 static
成员,即我喜欢 class_name.static_data
而不是 class_name.shared_obj.static_data
。
我搜索并找到 standard method of defining static members in Matlab
classes, on mathwork.com as you can see below.
classdef SharedData < handle % an auxiliary class to keep static data
properties
Data1
Data2
end
end
classdef UseData % main class
properties (Constant)
Data = SharedData
end
% Class code here
end
然后我们可以像这样使用它:
k = UseData
k.Data.Data1=5; % Want to be `k.Data1=5;` instead.
但我希望有一个顶级 static
成员
( 类似于
obj_of_UseData.Data1=5;
没有
obj_of_UseData.Data.Data1=5;
)
(即像顶级会员,而不是二级会员)。我寻求一种方法来实现顶级 static
成员,而不是二级成员。
谢谢
可以遵循 the advice from the MathWorks related to static data,并仍然创建使这些变量看起来像是成员的行为。您可以通过重载 subsref
和 subsasgn
方法来实现,如下所示。此代码使用创建静态数据的静态方法方式,因为它最简单,但思想转化为另一种方法,也使用句柄 class。
classdef UseData
properties
Data3
end
methods (Static)
function out = setgetVar(name,value)
persistent data;
if isempty(data)
data = struct('Data1',[],'Data2',[]);
end
if nargin==2
data.(name) = value;
end
out = data.(name);
end
end
methods
function obj = subsref(obj,S)
if isequal(S(1).type,'.')
if strcmp(S(1).subs,'Data1') || strcmp(S(1).subs,'Data2')
obj = UseData.setgetVar(S(1).subs);
return
end
end
obj = builtin('subsref',obj,S);
end
function obj = subsasgn(obj,S,value)
if isequal(S(1).type,'.')
if strcmp(S(1).subs,'Data1') || strcmp(S(1).subs,'Data2')
UseData.setgetVar(S(1).subs,value);
return
end
end
obj = builtin('subsasgn',obj,S,value);
end
end
end
要查看它的工作情况:
>> x = UseData;
>> y = UseData;
>> x.Data1 = 'bla';
>> y.Data2 = [5,6];
>> x.Data3 = 0;
>> y.Data3 = 10;
>> y.Data1
ans = bla
>> x.Data2
ans =
5 6
>> x.Data3
ans = 0
>> y.Data3
ans = 10