我如何遍历 nim 中 ref 对象的字段?

How do I iterate over the fields of a ref object in nim?

我有一个 ref object 类型,我想遍历它的所有字段并将它们回显出来。

这是我想要的示例:

type Creature* = ref object
    s1*: string
    s2*: Option[string]
    n1*: int
    n2*: Option[int]
    n3*: int64
    n4*: Option[int64]
    f1*: float
    f2*: Option[float]
    b1*: bool
    b2*: Option[bool]


var x = Creature(s1: "s1", s2: some("s2"), n1: 1, n2: some(1), n3: 2, n4: some(2.int64), f1: 3.0, f2: some(3.0), b1: true, b2: some(true))

for fieldName, fieldValue in x.fieldPairs:
  echo fieldName

但是,这样做会导致此编译器错误:

Error: type mismatch: got <Creature>
but expected one of:
iterator fieldPairs[S: tuple | object; T: tuple | object](x: S; y: T): tuple[
    key: string, a, b: RootObj]
  first type mismatch at position: 1
  required type for x: S: tuple or object
  but expression 'x' is of type: Creature
iterator fieldPairs[T: tuple | object](x: T): tuple[key: string, val: RootObj]
  first type mismatch at position: 1
  required type for x: T: tuple or object
  but expression 'x' is of type: Creature

expression: fieldPairs(x)

查看文档,似乎没有用于 ref 对象类型的迭代器,只有对象类型。如果是这样,那么你如何迭代 ref 对象类型?

如果你想使用迭代器,你需要de-reference你想迭代的ref-type!这也可能适用于需要 object 参数但您想与 ref object 实例一起使用的任何其他过程。

在 nim 中,de-referencing 运算符是 []

所以为了工作,ref 对象类型 Creature 的实例 x 在遍历它之前需要 de-referenced:

for fieldName, fieldValue in x[].fieldPairs:
  echo fieldName

这也适用于您编写的任何过程,例如:

proc echoIter(val: object) =
  for fieldName, fieldValue in val.fieldPairs:
    echo fieldName

echoIter(x[])