通用程序的nim类型定义是什么?
我在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”应该是“某些1D集合类型” - 可以是序列,数组,来自blas的向量等。我可以为表的常见集合添加具体策略,但我仍然遇到函数指针的问题,如
type
Strategy* = proc(t: any, ...)
let strategies* = toTable[string, Strategy]([
("foo-seq[int]", fooStrategy[int]), ...])
仍然有问题。 有什么建议么?
您的代码存在多个问题:
首先, initTable
不会为表格列出项目。 它只需要一个初始大小。 你想用toTable
来代替。
其次,创建表时,必须明确地为通用参数T设置一个值,因为在运行时,所有通用参数都必须绑定到一个类型。
第三,proc类型必须完全匹配,包括proc上的编译指示。 这个很棘手。
这是一个工作示例:
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]
实例化fooStrategy
和barStrategy
以匹配表类型。 我在类型定义中添加了{.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.}
如您所见,编译器会在第一行中告诉您它看到的内容,并在第三行中告诉您它期望的内容。 它看到proc
s的{.gcsafe, locks: 0.}
因为这些pragma隐含地分配给proc
上述定义的第 编译指示更改类型,因此能够将这些分配proc
s到Strategy[T]
你必须定义相同的pragma Strategy[T]
上一篇: what is nim type definition for generic procedure?
下一篇: Transfer Pivot Cache from a Pivot on one file to a Pivot on another?