我有一个类,它在构造函数中为对象分配一个不可变的UUID。以下是简化说明:
classdef mytest
properties (GetAccess = public, SetAccess = immutable)
uuid
end
properties
val
end
methods
function obj = mytest(valIn)
obj.uuid = char(java.util.UUID.randomUUID.toString);
if nargin < 1
valIn = 0;
end
obj.val = valIn;
end
end
end
这在一般情况下效果很好,但我刚刚发现了在为数组分配默认元素时MATLAB的行为问题。我曾经假设如果我输入
>> a(5) = mytest(2);
构造函数将被调用5次 - 没有输入参数的4次,以填充数组的默认元素1到4,并使用输入参数2
调用一次以分配最终元素。
然而,这不是MATLAB所做的 - 而是只在没有输入的情况下调用构造函数一次,然后将结果复制四次以填充元素1到4(然后按照预期的最终元素)。这意味着元素1到4的UUID结尾相同:</ p>
>> {a.uuid}'
ans =
'4424b91b-0977-4b4c-b18b-c4564875b952'
'4424b91b-0977-4b4c-b18b-c4564875b952'
'4424b91b-0977-4b4c-b18b-c4564875b952'
'4424b91b-0977-4b4c-b18b-c4564875b952'
'dbb8d862-8a1c-4bf9-876f-ef786e11a896'
事实证明这是我记忆中的行为,我只是没想到,我有点理解为什么MathWorks选择这样做(你可能不希望分别多次调用无输入构造函数的开销)。 / p>
但这不是我想要这个类的行为 - 有没有人知道强制为每个元素调用构造函数的方法?或许您可以建议一个具有所需行为的不同类设计?
PS我确实调查了MATLAB是否可能使用copy
方法复制这些默认元素 - 在这种情况下从matlab.mixin.Copyable
继承我的类,并覆盖copyElement
的行为可能会有所帮助 - 但看起来这并不是复制方式:(。
答案 0 :(得分:2)
免责声明:我对MATLAB课程不太熟悉。
看the relevant docs看来你做的一切都是正确的,MATLAB也是如此:
a(1,7) = SimpleValue(7)
分配给数组元素
a(1,7)
的对象使用传递给构造函数的输入参数作为分配给属性的值:...
MATLAB创建了元素
a(1,1:6)
中包含的对象,没有输入参数。属性的默认值为空[]
。...
MATLAB调用
SimpleValue
构造函数一次,并将返回的对象复制到数组的每个元素。
这表明您所遇到的是记录的行为:自动分配以前未分配的数组元素是通过对输入参数为零的构造函数的单调用完成的。
这也与使用随机初始值设定项的another example一致:示例代码使用
for k = 1:5
a(k) = ObjProp;
end
设置数组的5个元素,使它们包含不同的随机数据。至少从文档来看,这似乎是你的问题的解决办法:用手初始化每个空元素(这可能不是你想要做的)。