путающие проблемы с любым типом в Nim - PullRequest
0 голосов
/ 05 марта 2020

У меня есть тип:

type
  generic_seq[T] = ref object
    data: T
    case base: bool
    of false: down: generic_seq[any]
    of true: discard

и следующая строка кода:

var current_args: generic_seq[int] = generic_seq[int](base: true.bool, data: 3)

и строка компилятора: nim c -r main выдает ошибку: Error: invalid type: 'auto' in this context: 'generic_seq[system.int]' for var

Однако я не вижу, где любой тип может вызвать проблему путаницы типов. Объект generic_seq уже является хакерской «более безопасной» версией оригинала:

type
  generic_seq[T] = ref object
    data: T
    down: generic_seq[any]

, которая также не удалась при передаче аргументов generic_seq[int](data: 3, down: nil) таким же образом. Я не вижу, где неконкретный тип выставляется с какой-то двусмысленностью. Что мне не хватает? Может ли это быть плохой реализацией компилятора?

1 Ответ

0 голосов
/ 09 марта 2020

Я думаю, что ваша путаница возникает из-за попыток сделать это с помощью дженериков. Что вы пытаетесь сделать, так это, если я правильно понял, это объявить односвязный список объектов, который может быть любого типа. Более того, вы не хотите объявлять этот тип во время компиляции. Это означает, что вам придется делать это с помощью RTTI, используя модуль typeinfo Нима. Обратите внимание, что модуль typeinfo не рекомендуется, так как он имеет много ошибок, а именно относительно времени жизни объектов.

Вот обобщенная последовательность c с использованием typeinfo:

import typeinfo

type
  genSeq = ref object
    data: Any
    down: genSeq

var intDatum = 3
var strDatum = "hello, world!"
let child = genSeq(data: strDatum.toAny, down:nil)
let a = genSeq(data: intDatum.toAny, down: child)
echo a.data.getInt    # echos 3
echo a.down.data.getString # echos "hello, world!"

Однако, это может быть не то, что вы хотите, так как RTTI, как правило, дорого. Если набор объектов, которые вы хотите использовать, ограничен, вы можете использовать регистр выражений для получения того же результата без ограничений RTTI.

Для будущих вопросов вы также можете сделать кросс-пост на форуме nim: forum.nim-lang.org для более быстрого ответа.

...