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

D s=StructType(1,2)是到s=newstructType(1,2),因为s={a:1,b:2}是到\?\?\?,d,D,简短版本: D-langstruct*声明与structliteral声明{a:1,b:2}等价的是什么 较长版本: 我有一个D-lang结构,表示不同类型的节点(int、string等)。每个节点都有公共字段(例如节点类型)和特定于每个节点类型的字段(例如int_值、str_值) struct节点类型{ 数据类型数据类型; 联合{ 长整数; 字符串stru值; 双dbl_值; } } 我从一个函数返回它们,因为它们是值类型,所以我必须将它们作为NodeType*返回,而不是作为NodeTyp

简短版本:

D-lang
struct*
声明与
struct
literal声明
{a:1,b:2}
等价的是什么

较长版本:

我有一个D-lang结构,表示不同类型的节点(int、string等)。每个节点都有公共字段(例如节点类型)和特定于每个节点类型的字段(例如int_值、str_值)

struct节点类型{
数据类型数据类型;
联合{
长整数;
字符串stru值;
双dbl_值;
}
}
我从一个函数返回它们,因为它们是值类型,所以我必须将它们作为
NodeType*
返回,而不是作为
NodeType
返回。(如果不是这样,请告诉我如何从函数返回
NodeType
。)

作为一种风格和惯用的偏好,我想返回这些结构

返回新的ExprType(StrType,“输入文本”);//A.

返回{data\u type:StrType,str\u值:“Input text”};//B
而不是已经有一半太笨重了

ExprType*e=新的ExprType(StrType);//C
e、 str_value=“输入文本”;
返回e;
我不能使用构造函数语法(A),因为这会将
“输入文本”
分配给
int\u值
,并且
错误:无法将字符串类型的表达式(“输入文本”)隐式转换为long

文字语法(B)是错误的,因为它声明的是
ExprType
,而不是
ExprType*

我的问题是:与
ExprType
声明B等价的
ExprType*
文字声明是什么

一个几乎相同的问题:是否有一个版本的构造函数语法允许命名参数之类的东西?例如:

返回新的ExprType(StrType,stru值:“输入文本”);

谢谢。

D中没有命名参数。已经讨论过了,但目前没有

如果这是一个结构,您完全可以将其作为值类型返回:

返回节点类型(something);
很简单。或者你可以像现在这样使用GC。任何一个

在您的特定情况下,我要做的是定义三个构造函数。一个用于
string
,一个用于
double
和一个用于
ulong
,并让这些构造函数填写
数据类型

this(字符串str){
this.str_value=str;
this.data_type=DataType.StrType;
}

Shachar

在D中没有命名参数。已经讨论过了,但目前没有

如果这是一个结构,您完全可以将其作为值类型返回:

返回节点类型(something);
很简单。或者你可以像现在这样使用GC。任何一个

在您的特定情况下,我要做的是定义三个构造函数。一个用于
string
,一个用于
double
和一个用于
ulong
,并让这些构造函数填写
数据类型

this(字符串str){
this.str_value=str;
this.data_type=DataType.StrType;
}

Shachar对新声明的变量具有块初始化语法:

ExprType mytype = {
    data_type: StrType,
    str_value: "asdf",
};
不幸的是,这只适用于变量初始化。D中还没有“struct literal”语法

您也可以考虑使用静态工厂方法。它们不会像构造函数那样遭受重载冲突,并且可以执行使用块初始化语法无法执行的检查和断言(例如,不能将

int\u值
IntType
或类似的东西一起使用)


(虽然有点复杂,但理论上可以使用模板自动生成此类静态方法)

D为新声明的变量提供了块初始化语法:

ExprType mytype = {
    data_type: StrType,
    str_value: "asdf",
};
不幸的是,这只适用于变量初始化。D中还没有“struct literal”语法

您也可以考虑使用静态工厂方法。它们不会像构造函数那样遭受重载冲突,并且可以执行使用块初始化语法无法执行的检查和断言(例如,不能将

int\u值
IntType
或类似的东西一起使用)


(虽然有点复杂,但理论上可以使用模板自动生成此类静态方法)

命名参数的DIP(又名就地结构初始化)可以在此处找到:命名参数的DIP(又名就地结构初始化)可以在此处找到:为每种类型添加一个ctor可能是最简单的方法。到目前为止,实际上有大约10种数据类型(还有更多数据类型),而不仅仅是3种,所以这可能会有点相似。在我的程序中有一些数据类型(例如,符号、关键字、注释、str)由一维字符串类型表示。我需要所有str_expr()、int_expr()、sym_expr()等函数。宏,any?是否可以使用声明为返回节点类型的函数
返回{data\u type:DataType.StrType,str\u value:str}
NodeType n={data\u type:DataType.StrType,str\u value:str};返回n会起作用。我不知道D现在已经通过成员名进行了结构初始化,所以不,它不会起作用。但是,您可以在堆栈上创建返回类型的实例,以任何方式初始化它,然后按值返回。为每个类型添加一个ctor可能是最简单的方法。到目前为止,实际上有大约10种数据类型(还有更多数据类型),而不仅仅是3种,所以这可能会有点相似。有数据类型