2014-01-20 114 views
1
import std.stdio, std.string, std.conv, std.array; 
int main(){ 
foreach(int i,s; splitter("Hello world !")){ 
    writeln(i); 
    }; 
    return 0; 
} 

大家好! 我想獲得數組和字符串中的字符串索引。 爲什麼我得到這個錯誤?用字符串遍歷數組

dmd main.d 
Error: cannot infer argument types 
make: *** [c] Error 1 

回答

1

這是範圍模型的限制: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計數器變量非常簡單,以至於這個限制並不是什麼新鮮事。 ,雖然它有時會惹惱我們中的一些人。