对于跨分支使用重复字段名称的对象变量类型,有哪些替代方案?

时间:2019-04-29 18:31:04

标签: inheritance nim

当前,创建这样的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

还有什么其他方法可以解决此问题?

1 个答案:

答案 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 上的代码阅读者感到困惑。毕竟,对所有内容使用相同的名称可能不是一个好主意。