gpt4 book ai didi

nim-lang - 通用过程的 nim 类型定义是什么?

转载 作者:行者123 更新时间:2023-12-02 19:44:54 24 4
gpt4 key购买 nike

我有一个在 nim 中表示为泛型的策略:

proc fooStrategy[T](t: T, ...)
proc barStrategy[T](t: T, ...)

我想按名称为策略创建一个查找表...所以我尝试了:

type
Strategy*[T] = proc[T](t: T, ...)

let strategies* = toTable[string, Strategy[T]]([
("foo", fooStrategy), ("bar", barStrategy)])

这不起作用——类型声明失败。如果我能做到这一点,我可以猜测策略表也会有问题。还有其他方法可以做到这一点吗? “T”应该是“某种一维集合类型”——可以是序列、数组、来自 blas 的向量等。我可以向表中添加常见集合的具体策略,但我仍然遇到函数指针的问题,作为

type
Strategy* = proc(t: any, ...)

let strategies* = toTable[string, Strategy]([
("foo-seq[int]", fooStrategy[int]), ...])

仍然有问题。有什么建议吗?

最佳答案

您的代码存在多个问题:

首先,initTable 不获取表中的项目列表。它只需要一个初始大小。您想使用 toTable 来代替。

其次,创建表时必须显式设置泛型参数 T 的值,因为在运行时,所有泛型参数都必须绑定(bind)到类型。

第三,过程类型必须完全匹配,包括过程上的编译指示。这个很棘手。

这是一个工作示例:

import tables

type
Strategy*[T] = proc(t: T) {.gcsafe, locks: 0.}

proc fooStrategy[T](t: T) = echo "foo"
proc barStrategy[T](t: T) = echo "bar"

let strategies* = toTable[string, Strategy[int]]([
("foo", fooStrategy[int]), ("bar", barStrategy[int])
])

在此示例中,我创建了一个包含 Strategy[int] 值的表(您不能拥有包含 Strategy[T] 值的表,因为这不是具体类型)。我使用 [int] 实例化 fooStrategybarStrategy 以匹配表类型。我将 {.gcsafe, locks: 0.} 添加到类型定义中。如果省略,您将收到编译器错误:

test.nim(9, 49) Error: type mismatch: got (Array constructor[0..1, (string, proc (t: int){.gcsafe, locks: 0.})])
but expected one of:
proc (pairs: openarray[(string, Strategy[system.int])]): Table[system.string, Strategy[system.int]]{.gcsafe, locks: 0.}

如您所见,编译器在第一行告诉您它看到了什么,在第三行告诉您它期望什么。它看到带有 {.gcsafe, locks: 0.}proc,因为这些编译指示被隐式分配给上面定义的 proc。编译指示会更改类型,因此为了能够将这些 proc 分配给 Strategy[T],您必须为 Strategy[T] 定义相同的编译指示.

关于nim-lang - 通用过程的 nim 类型定义是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36930531/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com