使用可变可变参数在 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
尝试制作一个简单的过程来修改 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