2016-08-07 2 views
0

Короткая версия:s = StructType (1, 2) относится к s = new StructType (1, 2), поскольку s = {a: 1, b: 2} принадлежит ? ? ? ?

Что такое D-Ланг struct * заявления, что эквивалентно struct буквальных деклараций { a:1, b:2 }?

Чем дольше версия:

У меня D-Ланг структуры, представляющие узлы различного типа (Int, строки и т.д.). Каждый узел имеет общие поля (например, тип узла) и поля, специфичные для каждого типа узлов (например, int_value, str_value).

struct NodeType { 
    DataType data_type; 
    union { 
     long int_value; 
     string str_value; 
     double dbl_value; 
    } 
} 

Я возвращаю их из функции и, поскольку они являются типами значений, я должен вернуть их в NodeType *, а не как NodeType. (Если это не так, скажите, пожалуйста, как вернуть NodeType из функции.)

В стилистическом и идиоматических предпочтения, я хочу, чтобы вернуть эти структур с чем-то вроде

return new ExprType(StrType, "Input text");    // A 

или

return { data_type:StrType, str_value:"Input text" }; // B 

, а не так, слишком неуклюжим наполовину снова уже

ExprType *e = new ExprType(StrType);      // C 
e.str_value = "Input text"; 
return e; 

Я не могу использовать синтаксис конструктора (A), поскольку он назначает "Input text" на int_value и Error: cannot implicitly convert expression ("Input text") of type string to long.

Литеральный синтаксис (B) неверен, поскольку он объявляет ExprType, а не ExprType *.

Мой вопрос: что такое буквальное объявление ExprType *, которое эквивалентно декларации ExprType?

Почти эквивалентный вопрос: есть ли версия синтаксиса конструктора, которая позволяет что-то вроде именованного параметра? Например:

return new ExprType(StrType, str_value: "Input text"); 

спасибо.

+0

DIP для названных параметров (он же в месте инициализации структуры) можно найти здесь: https://github.com/dlang/DIPs/pull/22 – greenify

ответ

3

Нет никаких именованных параметров в D. Это обсуждалось, но на данный момент их нет.

Если это структура, вы можете абсолютно вернуть его в качестве типа значения:

return NodeType(something); 

просто работает. Или вы можете использовать GC, как вы делаете. Или один.

В вашем конкретном случае то, что я сделал бы, это определить три конструктора.Один за string, один для double и один для ulong, и есть те конструкторы заполнить data_type:

this(string str) { 
    this.str_value = str; 
    this.data_type = DataType.StrType; 
} 

Шахар

+0

Добавление ctor для каждого типа может быть самым простым способом. На данный момент существует около 10 типов данных (с более приближающимися), а не только 3, поэтому они могут быть немного похожими. – neniu

+0

По трем мыслям, переопределения ctor с отличающимися типизированными параметрами будет недостаточно. В моей программе есть типы данных (например, символ, ключевое слово, комментарий, строка), представленные одним типом типа D. Мне понадобятся все функции str_expr(), int_expr(), sym_expr() и т. Д. После. Макросы, кто-нибудь? – neniu

+0

Возможна ли функция 'return {data_type: DataType.StrType, str_value: str}' с функцией, которая была объявлена ​​для возврата 'NodeType'? 'NodeType n = {data_type: DataType.StrType, str_value: str}; return n; 'будет работать, если это так близко, как D. – neniu

0

D имеет блочно синтаксис инициализации для вновь объявленных переменных:

ExprType mytype = { 
    data_type: StrType, 
    str_value: "asdf", 
}; 

К сожалению , это работает только для переменной инициализации. В D еще нет синтаксиса «struct literal».

Вы также можете рассмотреть использование статических заводских методов. Они не будут страдать от конфликтов перегрузки, таких как конструкторы, и могут выполнять проверки и утверждения, которые невозможны с использованием синтаксиса инициализации блока (например, не могут использовать int_value с IntType или что-то в этом роде).

static ExprType str(string val) { 
    ExprType v = { 
     data_type: StrType, 
     str_value: "asdf", 
    }; 
    return v; 
} 

auto mytype = ExprType.str("asdf"); 

(Хотя это будет немного сложнее, теоретически вы можете генерировать такие статические методы автоматически с использованием шаблонов)

Смежные вопросы