以字符串为键的字符串数组的 Dlang 关联数组具有意外行为

问题描述 投票:0回答:1

以下代码的输出并不像我想象的那样。看来对 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"]]
arrays dictionary associative-array d
1个回答
0
投票

有人指出我使用关联数组 update() 方法,并解释说切片(动态数组)由一个指针和一个长度组成,即使内容本身被引用,它们也会被复制。因此,当切片在其外部更新时,关联数组中的切片不会更新。

所以我用它来创建一个包含单个项目的新列表,或者将一个值附加到列表(如果它已经存在):

testAA.update("Key", () => ["Val1"], (ref string[] x) {x ~= "Val1";});
© www.soinside.com 2019 - 2024. All rights reserved.