1

我想在 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

这段代码给了我编译错误:

file.d(53): Error: found ':' when expecting ';' following statement
file.d(54): Error: found ':' when expecting ';' following statement
file.d(55): Error: expression expected, not '}'
file.d(56): Error: found '}' when expecting ';' following return statement
4

2 回答 2

7

C 风格的 {} 语法仅在顶级声明中可用

SomeStruct c = { foo, bar, etc}; // ok

但是像你一样返回它是行不通的——在其他情况下, { stuff } 表示函数文字。

return {
    writeln("cool");
};

例如,将尝试返回一个 void function() 并且您会看到类型不匹配。

最适合 D 的方式是使用构造函数样式语法。它不会做命名成员,但可以在任何地方工作:

return Record(1, 1, 1);

那里的每个参数都填充结构的一个成员。所以 Record(1,2,3) 设置 protocolVersion 为 1,type 为 2,requestId 为 3。

您还可以定义 struct 构造函数来自定义此行为,语法有,this(int arg, int arg2) { currentVersion = arg; /* and whatever else */ }但如果您只想填写所有成员,则不必定义构造函数。return Record(1,1,1);将与您的代码一起使用。

于 2013-11-13T20:52:29.137 回答
5

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

return Record(1, 1, 1);
于 2013-11-13T20:52:12.883 回答