使用可变可变参数在 Nim 中不能像预期的那样工作

Using mutable varargs doesnt work as expected in Nim

尝试制作一个简单的过程来修改 nim 中可变数量的参数(例如从输入中初始化多个 a 变量)。

proc Read(outputVars: var varargs[int]) =
    for v in outputVars.mitems:
        v = 3

var
    a, b, c : int

Read(a, b, c)

但是编译器不喜欢这样并输出:

Error: type mismatch: got <int, int, int>
but expected one of:
proc Read(outputVars: var varargs[int])
  first type mismatch at position: 1
  required type for outputVars: var varargs[int]
  but expression 'a' is of type: int
  
expression: Read(a, b, c)

如何制作一个接受可变参数的可变数量的过程?

这不起作用的原因是因为 varargs 是一个底层数组。即使它是可变的,值仍然必须复制到数组中,因此更新它们不会更新原始变量。

IMO 表达您的示例的正确“安全”方式类似于 varargs[var int],即整数的可变视图数组。但这也 不起作用 因为 Nim 的 views 功能仍处于试验阶段。

可行的一个不太安全的解决方案是使用 coercing varargs 整数指针。例如:

proc varIntAddr(n: var int): ptr int =
  addr n

proc read(outputVars: varargs[ptr int, varIntAddr]) =
  for v in outputVars:
    v[] = 3

var a, b, c: int

read(a, b, c)

echo (a, b, c)

在这里,如果您传入可变整数,varIntAddr 将隐式应用于它们以获取它们的地址,这些地址将被添加到数组中。

您也可以像这样概括过程:

proc varAddr[T](n: var T): ptr T =
  addr n