Syntax 如何初始化和返回内嵌结构?

Syntax 如何初始化和返回内嵌结构?,syntax,struct,return,d,Syntax,Struct,Return,D,我想初始化一个结构并返回它,在Digitalmars D的同一行。我该怎么做 struct Record { immutable(ubyte) protocolVersion; immutable(ubyte) type; immutable(ushort) requestId; } class test { Record nextRequest() { ubyte buffer[512]; auto bytesReceived

我想初始化一个结构并返回它,在Digitalmars D的同一行。我该怎么做

struct Record {
    immutable(ubyte) protocolVersion;
    immutable(ubyte) type;
    immutable(ushort) requestId;
}

class test {
    Record nextRequest() {
        ubyte buffer[512];
        auto bytesReceived = socketIn.receive(buffer);
        if(bytesReceived < 0)
            throw new ErrnoException("Error while receiving data");
        else if(bytesReceived == 0)
            throw new ConnectionClosedException();

        return {
            protocolVersion:1, //52
            type:1, //53
            requestId:1 //54
        }; //55
    } //56
} // 57

到目前为止,最简单的方法是简单地调用默认构造函数

return Record(1, 1, 1);

到目前为止,最简单的方法是简单地调用默认构造函数

return Record(1, 1, 1);

C样式{}语法仅在top声明中可用

SomeStruct c = { foo, bar, etc}; // ok
但是像您那样返回它是行不通的——在其他上下文中,{stuff}意味着函数文本

return {
    writeln("cool");
};
例如,如果您尝试返回一个void函数(),您将看到类型不匹配

使用D最好的方法是使用构造函数样式的语法。它不支持命名成员,但在任何地方都有效:

return Record(1, 1, 1);
其中的每个参数都会填充结构的一个成员。所以记录(1,2,3)将protocolVersion设置为1,type设置为2,requestId设置为3


您还可以定义结构构造函数来自定义此行为,语法是
this(int-arg,int-arg2){currentVersion=arg;/*和其他任何*/}
,但如果您只想填充所有成员,则不必定义构造函数<代码>返回记录(1,1,1)将按您现有的方式使用代码。

C样式{}语法仅在顶级声明中可用

SomeStruct c = { foo, bar, etc}; // ok
但是像您那样返回它是行不通的——在其他上下文中,{stuff}意味着函数文本

return {
    writeln("cool");
};
例如,如果您尝试返回一个void函数(),您将看到类型不匹配

使用D最好的方法是使用构造函数样式的语法。它不支持命名成员,但在任何地方都有效:

return Record(1, 1, 1);
其中的每个参数都会填充结构的一个成员。所以记录(1,2,3)将protocolVersion设置为1,type设置为2,requestId设置为3


您还可以定义结构构造函数来自定义此行为,语法是
this(int-arg,int-arg2){currentVersion=arg;/*和其他任何*/}
,但如果您只想填充所有成员,则不必定义构造函数<代码>返回记录(1,1,1)将按您现有的方式处理代码。

为什么不可变,这使得无法复制或分配到记录…结构的成员变量不能是不可变的,只要它在构造函数中初始化就可以吗?(类似于Java的final)我知道这种行为存在于类中。是的,但它不能被复制,记住它们总是通过值传递。为什么不可变,这使得复制或分配到记录变得不可能…结构的成员变量不能是不可变的,只要它在构造函数中初始化就可以吗?(类似于Java的final)我知道这种行为存在于类中。是的,但是它不能被复制,记住它们总是通过值传递,而不是默认构造函数。D中的结构没有默认构造函数。默认构造函数是不带参数的构造函数
Record(1,1,1)
调用一个普通构造函数,不过在本例中,它是由编译器生成的(因为没有声明)。所以,我猜是因为它是生成的,所以你错误地使用了术语“默认构造函数”。是的,这正是我称它为默认构造函数的原因。那不是默认构造函数。D中的结构没有默认构造函数。默认构造函数是不带参数的构造函数
Record(1,1,1)
调用一个普通构造函数,不过在本例中,它是由编译器生成的(因为没有声明)。所以,我猜是因为它是生成的,所以你错误地使用了术语“默认构造函数”。是的,这正是我称它为默认构造函数的原因。