简短版本:
D-lang struct *
声明与struct
文字声明{ a:1, b:2 }
相同?
版本较长:
我有一个D-lang结构,表示不同类型的节点(int,string等)。每个节点都有公共字段(例如节点类型)和特定于每个节点类型的字段(例如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 *
声明B等效的ExprType
文字声明是什么?
一个几乎相同的问题:是否有一个版本的构造函数语法允许类似命名参数?例如:
return new ExprType(StrType, str_value: "Input text");
谢谢。
答案 0 :(得分:3)
D中没有命名参数。已经讨论过了,但目前还没有。
如果这是一个结构,你绝对可以将它作为值类型返回:
return NodeType(something);
简单有效。或者您可以像使用GC一样使用GC。其中一个。
在您的特定情况下,我要做的是定义三个构造函数。一个用于string
,一个用于double
,一个用于ulong
,并且这些构造函数填入data_type
:
this(string str) {
this.str_value = str;
this.data_type = DataType.StrType;
}
Shachar
答案 1 :(得分:0)
D具有新声明的变量的块初始化语法:
ExprType mytype = {
data_type: StrType,
str_value: "asdf",
};
不幸的是,这仅适用于变量初始化。没有" struct literal" D中的语法。
您也可以考虑使用静态工厂方法。他们不会像构造函数那样遭受过载冲突,他们可以使用块初始化语法执行不可能的检查和断言(例如,不能int_value
使用IntType
static ExprType str(string val) {
ExprType v = {
data_type: StrType,
str_value: "asdf",
};
return v;
}
auto mytype = ExprType.str("asdf");
1}}或类似的东西)。
with open('some_file.txt','wb'): # save non-ascii bytes (superscript 3 might even work with just 'w')
f.write('Units ft\xb3\n') #\xb3 is the superscript 3 in utf8 encoding
(虽然它有点复杂,理论上你可以使用模板自动生成这样的静态方法)