以下代码的输出并不像我想象的那样。看来对 testAA.require() 返回的字符串数组进行更改不会反映在关联数组中。我认为动态数组是通过引用传递的,但这似乎与这个概念相反。将数组重新分配给 testAA 似乎确实有效,但是这不起作用的原因令我困扰。任何提示或想法将不胜感激!
module main;
import std.stdio;
void main()
{
string[][string] testAA;
string[] vals = ["InitVal1", "InitVal2"];
auto list = testAA.require("Key", vals);
writeln("list: ", list);
list ~= "Val1";
list ~= "Val2";
writeln("list: ", list);
writeln("testAA", testAA);
}
这会导致输出:
list: ["InitVal1", "InitVal2"]
list: ["InitVal1", "InitVal2", "Val1", "Val2"]
testAA["Key":["InitVal1", "InitVal2"]]
有人指出我使用关联数组 update() 方法,并解释说切片(动态数组)由一个指针和一个长度组成,即使内容本身被引用,它们也会被复制。因此,当切片在其外部更新时,关联数组中的切片不会更新。
所以我用它来创建一个包含单个项目的新列表,或者将一个值附加到列表(如果它已经存在):
testAA.update("Key", () => ["Val1"], (ref string[] x) {x ~= "Val1";});