将containers.Map作为类属性时出现奇怪的MATLAB行为

时间:2013-10-03 01:11:13

标签: matlab properties map containers matlab-class

我创建了自己的类,如下所示:

classdef testClass < handle
    properties
        value;
        map = containers.Map('KeyType','double','ValueType','any');
    end
end

我的目标是让testClass的每个对象保持自己的地图。但是,事实证明,整个类只有一个地图对象:testClass的所有对象都可以访问同一个containers.Map。例如,如果我按如下方式创建两个对象

a = testClass;
b = testClass;

a.value = 'a';
b.value = 'b';

a.map(1) = 123;
b.map(2) = 321;

最终ab的地图包含两个键值对:

>> a
a = 
  testClass handle

    Properties:
      value: 'a'
        map: [2x1 containers.Map]

>> b
b = 
  testClass handle

    Properties:
      value: 'b'
        map: [2x1 containers.Map]
    Methods, Events, Superclasses

两个(键,值)对(1,123)和(2,321)同时出现在a.mapb.map

>> a.map.keys
ans = 
    [1]    [2]
>> a.map.values
ans = 
    [123]    [321]

>> b.map.keys
ans = 
    [1]    [2]
>> b.map.values
ans = 
    [123]    [321]

这是一个错误吗?如何为每个类对象保持独立containers.Map

1 个答案:

答案 0 :(得分:8)

问题不在于testClasshandle,而是在您认为properties块中指定的初始值不会被评估。 MATLAB仅在加载类时计算类属性的默认值,然后将该值提供给类的每个新实例。

您可以通过查看testClass的元类来查看此内容。例如:

c = testClass;
c.map(1) = 42;
hc = ?testClass;
hc.PropertyList(2).DefaultValue.keys % returns [1]
hc.PropertyList(2).DefaultValue.values % returns [42]

如果希望每个实例都有不同的映射,则必须在构造函数中显式构造映射。 (是的,我去过那里,做过那个)。