Какие существуют альтернативы использованию варианта варианта объекта с повторяющимся именем поля в разных ветвях? - PullRequest
1 голос
/ 29 апреля 2019

В настоящее время создается вариант объекта типа, подобного этому:

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

приводит к ошибке:

Ошибка: попытка переопределить: 'bar'

потому что разные ветви варианта не могут совместно использовать поля. Есть открытый вопрос об этом , но так как ему более 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 Ответ

3 голосов
/ 30 апреля 2019

Для полноты информации другим способом решения проблемы является избегание переопределения с помощью префикса затронутых переменных:

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 в одной ветке варианта и число с плавающей запятой bar в другой, что также вызывает путаницу для читателя кода на телефонной станции . Возможно, использование одного и того же имени для всего может быть не очень хорошей идеей.

...