這是範圍模型的限制:foreach超出範圍給出當前項目,但不是當前索引。最簡單的修補是使用從std.string/std.array分(其中急切地分配一個新的數組來保存結果,並返回),或者簡單地保持在一個外部變量自己算:
int i;
foreach(s; splitter("whatever")) {
// use s and i
i++;
}
儘管請注意,從分離器返回的範圍無論如何都不能編入索引... splitter("whatever")[0]
將無法編譯。分離器的工作方式是僅根據需要找到下一個分割點,並且一次只能執行一個分割點,因爲它涉及掃描字符串。作爲一般規則的範圍不喜歡在其方法中使用循環 - 所以速度的複雜性很容易被用戶看到 - 並且掃描字符串當然需要一個循環。
該索引可能會自動保存,但該語言根本不會這樣做。隨着一些自定義的foreach操作,它要求你定義一個函數:
int opApply(int delegate(int idx, string s) dg);
在那裏,你可以foreach(i, s) {}
,它會從opApply定義看着辦吧。但是對於範圍,它是這樣的:
for(auto f = range.front; !range.empty; range.popFront())
沒有空間來定義第二個索引變量的範圍,也沒有自動插入。這可能會在某個時候發生變化,但它到底會如何發展,並且沒有特別的急於在社區中實現 - 添加自己的int計數器變量非常簡單,以至於這個限制並不是什麼新鮮事。 ,雖然它有時會惹惱我們中的一些人。