当前,创建这样的object variant类型:
type
FooKind = enum a, b, c
Foo = object
case kind: FooKind
of a:
bar, a: int
of b:
bar, b: int
of c:
c: int
导致错误:
错误:尝试重新定义:“酒吧”
因为该变体的不同分支无法共享字段。有一个open issue about that,但由于它已经3年多了,但仍未解决,所以我没有屏息。
我看到一些可能的选择:
type
FooKind = enum a, b, c
Foo = object
bar: int
case kind: FooKind
of a:
a: int
of b:
b: int
of c:
c: int
type
FooKind = enum a, b, c
Foo[K: static[FooKind]] = object
when K == a:
bar, a: int
elif K == b:
bar, b: int
elif K == c:
c: int
type
FooKind = enum a, b, c
FooBase = object
kind: FooKind
FooA = object of FooBase
bar, a: int
FooB = object of FooBase
bar, b: int
FooC = object of FooBase
c: int
还有什么其他方法可以解决此问题?
答案 0 :(得分:3)
为完整起见,处理该问题的另一种方法是通过对受影响的变量添加前缀来避免重新定义:
type
FooKind = enum a, b, c
Foo = object
case kind: FooKind
of a:
aBar, a: int
of b:
bBar, b: int
of c:
c: int
虽然示例尝试重用 bar
类型,但您也可以在变体的分支中使用整数bar
,并使用浮点数{{1} },这也会导致 callsite 上的代码阅读者感到困惑。毕竟,对所有内容使用相同的名称可能不是一个好主意。