我有一个类,它在其构造函数中为对象分配一个不可变的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,一次使用 input 参数2
来分配最终元素。
但是,这不是 MATLAB 所做的 - 相反,它只调用一次构造函数,没有输入,然后将结果复制四次以填充元素 1 到 4(然后按照预期填充最后一个元素(。这意味着 UUID 的 ef 元素 1 到 4 最终相同:
>> {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 选择这样做(您可能不希望多次单独调用无输入构造函数的开销(。
但这不是我想要的这个类的行为 - 有谁知道强制为每个元素调用构造函数的方法?或者,也许您可以建议具有所需行为的不同类设计?
PS 我确实调查了 MATLAB 是否可能使用 copy
方法复制这些默认元素 - 在这种情况下,从 matlab.mixin.Copyable
继承我的类,并覆盖copyElement
的行为可能会有所帮助 - 但看起来这不是它复制:(的方式。
免责声明:我对 MATLAB 类不太熟悉。
查看相关文档,您似乎做的一切都是正确的,MATLAB 也是如此:
a(1,7) = SimpleValue(7)
分配给数组元素的对象
a(1,7)
使用传递给构造函数的输入参数作为分配给属性的值:。
MATLAB 创建了包含在没有输入参数的元素
a(1,1:6)
中的对象。属性的默认值为空[]
。。
MATLAB 调用
SimpleValue
构造函数一次,并将返回的对象复制到数组的每个元素。
这表明您遇到的是记录在案的行为:以前未分配的数组元素的自动分配是通过对具有零输入参数的构造函数的单次调用来完成的。
这也与使用随机初始值设定项的另一个示例一致:示例代码使用
for k = 1:5
a(k) = ObjProp;
end
设置数组的 5 个元素,使它们包含不同的随机数据。至少从文档中来看,这似乎是您问题的解决方法:手动初始化每个空元素(这可能不是您想要做的(。