如何从 nim 表中获取可修改的值

How to get modifyable values from nim Tables

我是 Nim 的新手,正在尝试修改 table 中的值。具体来说,我想将项目附加到作为值存储在 table 中的序列。我当前的代码如下:

import tables

var table = initTable[string, seq[string]]()
table["a"] = @["foo"]
var x = table["a"]
x.add("bar")

echo $table

table 条目“a”只包含 ["foo"] 而不是 ["foo", "bar"],我猜这是因为访问 table["a "] 正在返回最初插入的序列的副本。我如何访问(参考)原始序列,而不是副本? 谢谢!

您的问题在线:

var x = table["a"]

这实际上复制了 table["a"] 中存储的内容。因为 seqs 是 pass-by-copy 的,所以这会将存储在 seq 中的所有数据复制到存储在 x 中的新 seq 中。如果你想引用存储在 table 中的序列,你有两个选择:

  • 更安全的选择,直接修改值即可。 tables.[] returns 所有 var Table 一个 var T
table["a"].add("bar")
  • 不安全选项,获取指向该值的指针并修改它
var x = addr table["a"]
x[].add("bar")

但是我建议不要使用指针,除非您完全确定自己知道自己在做什么。还有一个实验性功能:视图类型。但是,它还不是 stable,甚至这个简单的示例也会因 SIGSEGV 而失败(从 1.4.2 开始):

var x: var seq[string] = table["a"]
x.add("bar")