如何解决我可以解包 `varargs` 以用作 nim 的单个过程调用参数吗?
我需要从过程的输入中解压 varargs
以用作过程的各个参数..
在python中,您可以像这样“解压缩”函数调用的参数列表:
def fun(a,b,c,d):
print(a,d)
my_list = [1,2,3,4]
# Unpacking list into four arguments
fun(*my_list) # asterisk does the unpacking
所以列表中的每一项都被用作函数调用中的一个单独参数。
这可以在 nim 中实现吗?我知道您可以使用 varargs
接受任意数量的过程参数,但我想将 varargs
中的参数序列解包以将它们用作不接受 {{ 1}}。
假设我正在尝试解压缩一系列参数以创建一个可以运行任何任意过程(具有任意数量的参数)的过程,并告诉用户运行所述过程需要多长时间。我不想编写所有过程来接受 varargs
类型,因此如果可能,解压缩序列将是最好的解决方案。
varargs
我知道这段代码不正确,而且我对 nim 还很陌生,所以我在思考正确的方法时遇到了一些困难。
解决方法
参见 macros
标准库中的 unpackVarargs
。
import std/[times,macros]
template timeIt*(theFunc: proc,passedArgs: varargs[typed]): float =
let t = cpuTime()
echo unpackVarargs(theFunc,passedArgs)
cpuTime() - t
proc add2(arg1,arg2: int): int =
result = arg1 + arg2
proc add3(arg1,arg2,arg3: float): float =
result = arg1 + arg2 + arg3
echo timeIt(add2,15,5)
echo timeIt(add3,15.5,123.12,10.009)
https://play.nim-lang.org/#ix=3rwD
这是一个甚至不需要 unpackVarargs
的替代答案(来源:GitHub @timotheecour)。它在 varargs[untyped]
模板中使用 timeIt
类型:
import std/[times]
template timeIt*(theFunc: proc,passedArgs: varargs[untyped]): float =
let t = cpuTime()
echo theFunc(passedArgs)
cpuTime() - t
proc add2(arg1,10.009)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。