Короткая версия: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");
спасибо.
DIP для названных параметров (он же в месте инициализации структуры) можно найти здесь: https://github.com/dlang/DIPs/pull/22 – greenify