迭代dlang结构

Cha*_* L. 6 iteration d

我有一个看起来像这样的结构:

struct MultipartMessage {
    ubyte[] mime, data;
    Header header;

    void setSender(string sender) {
        header.sender = sender;
    }
    void setId(int id) {
        header.id = id;
    }
}
Run Code Online (Sandbox Code Playgroud)

我想迭代它,在另一个类中使用这样的东西:

struct Socket {
    ...

    void send(MultipartMessage msg) {
        foreach (part; msg) {
            sendPart(part);
        }
    }

    ...
}
Run Code Online (Sandbox Code Playgroud)

这可能吗?我想使用类似于Python的东西 __iter__,MultipartMessage它可以按特定的顺序返回字段,理想情况下甚至可以运行一些额外的代码,比如header.serialize().

理想情况下,我会添加一个函数MultipartMessage,看起来像这样(伪代码):

ubyte[] __iter__() {
    yield mime;
    yield data;
    yield header.serialize(); //header.serialize returns a ubyte[]
}
Run Code Online (Sandbox Code Playgroud)

Vla*_*eev 8

用途tupleof:

foreach (ref part; msg.tupleof)
    sendPart(part);
Run Code Online (Sandbox Code Playgroud)

这将调用sendPartmime,dataheader(该结构的领域,他们的顺序进行声明).您可以通过检查其类型来过滤字段,例如static if (!is(typeof(part) == Header)).

要获取字段的名称,您可以使用__traits(identifier):

foreach (i, ref part; msg.tupleof)
    writeln(__traits(identifier, msg.tupleof[i]));
Run Code Online (Sandbox Code Playgroud)

(__traits(identifier, part)会回来part.)

还有__traits(allMembers),它也返回方法.


Dej*_*kic 2

最接近您想要的东西可能是opApply

请参阅http://dlang.org/spec/statement.html部分Foreach over Structs and Classes wit opApply

这将起作用:

int opApply(int delegate(ref ubyte[]) dg) {
    int result = 0;
    result = dg(mime);
    result = dg(data);
    ubyte[] header_bytes = header.serialize();
    result = dg(header_bytes);
    return result;
}
Run Code Online (Sandbox Code Playgroud)