我如何遍历 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[])
我有一个 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[])