通用程序的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]实例化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.}

如您所见,编译器会在第一行中告诉您它看到的内容,并在第三行中告诉您它期望的内容。 它看到proc s的{.gcsafe, locks: 0.}因为这些pragma隐含地分配给proc上述定义的第 编译指示更改类型,因此能够将这些分配proc s到Strategy[T]你必须定义相同的pragma Strategy[T]

链接地址: http://www.djcxy.com/p/91517.html

上一篇: what is nim type definition for generic procedure?

下一篇: Transfer Pivot Cache from a Pivot on one file to a Pivot on another?