你好我想定义我自己的类集合,并在foreach语句中使它可迭代,就像这样:
public class Collection(Type)
{
...
private T head;
private Collection!(T) queue;
}
Collection!(int) temp;
foreach (int t; temp) { ... }
我应该定义哪些方法,以及如何定义?
答案 0 :(得分:9)
您可以指定front
,popfront()
和empty
函数:(但除非您使用save(),否则这将使用您的集合)
public class Collection(T) { ... private T head; private Collection!(T) queue;
@property T front(){
return head;
}
@property bool empty(){
return queue is null;
}
void popfront(){
head = queue.head;
queue = queue.queue;
}
Collection!T save(){
return new Collection!T(head,queue);
}
}
或使用专用结构进行迭代(如std.container
模块
public class Collection(T) { ... private T head; private Collection!(T) queue;
Range opSlice(){
return Range(head,queue);
}
struct Range{
T h;
Collection!(T) q;
this(T he, Collection!(T) qu){
h=he;
q=qu;
}
@property T front(){
return h;
}
@property bool empty(){
return q is null;
}
void popfront(){
h = q.head;
q= q.queue;
}
Collection!T save(){
return this;
}
}
}
所以迭代就像这样完成
Collection!(int) temp; foreach (int t;temp[]) { ... }
您还可以为正常的foreach添加opApply
:
public int opApply(int delegate(ref T) dg){
int res=0;
foreach(ref T;this[]){
res = dg(t);
if(res)return res;
}
return res;
}
答案 1 :(得分:5)
看看这个documentation on ForeachStatements并向下滚动一下。
如果我正确阅读您的示例,您可以为opApply
定义Collection
,如下所示:
public int opApply(int delegate(ref T) dg){
Collection!T p = this;
int res = 0;
while(!res && p !is null){
res = dg(p.head);
p = p.queue;
}
return res;
}
答案 2 :(得分:3)
您的Collection类应该实现opApply。你的foreach主体成为内部for循环的委托,你使用for循环迭代你的内部集合(在你的情况下是一个队列)。
考虑文档中给出的示例
class Foo {
uint array[2];
int opApply(int delegate(ref uint) dg)
{ int result = 0;
for (int i = 0; i < array.length; i++)
{
result = dg(array[i]);
if (result)
break;
}
return result;
}
}