我有一个看起来像这样的结构:
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)
用途tupleof:
foreach (ref part; msg.tupleof)
sendPart(part);
Run Code Online (Sandbox Code Playgroud)
这将调用sendPart用mime,data和header(该结构的领域,他们的顺序进行声明).您可以通过检查其类型来过滤字段,例如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),它也返回方法.
最接近您想要的东西可能是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)