s = StructType(1,2)是s = new StructType(1,2),因为s = {a:1,b:2}是\?\?\?\?

时间:2016-08-07 01:14:14

标签: d

简短版本:

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");

谢谢。

2 个答案:

答案 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

(虽然它有点复杂,理论上你可以使用模板自动生成这样的静态方法)