D 用字符串遍历数组

D 用字符串遍历数组,d,D,大家好! 我想在数组和字符串中获取字符串索引。 为什么我会犯这个错误 import std.stdio, std.string, std.conv, std.array; int main(){ foreach(int i,s; splitter("Hello world !")){ writeln(i); }; return 0; } 这是范围模型的一个限制:foreach over ranges提供一个当前项,但不提供当前索引。最简单的修复方法是使用split fr

大家好! 我想在数组和字符串中获取字符串索引。 为什么我会犯这个错误

import std.stdio, std.string, std.conv, std.array;
int main(){
foreach(int i,s; splitter("Hello world !")){
    writeln(i);
    };
    return 0;
}

这是范围模型的一个限制:foreach over ranges提供一个当前项,但不提供当前索引。最简单的修复方法是使用split from std.string/std.array(它急切地分配一个新数组来保存结果并返回该结果),或者简单地在外部变量中保存一个计数:

dmd main.d
Error: cannot infer argument types
make: *** [c] Error 1
尽管请注意,从拆分器返回的范围无论如何都无法索引<代码>拆分器(“任意”)[0]将无法编译。拆分器的工作方式是,它只能根据需要查找下一个拆分点,并且一次只能查找一个,因为它涉及到扫描字符串。一般来说,范围不喜欢在其方法中使用循环,因此速度复杂度对用户来说很容易看到,扫描字符串当然需要循环

索引可能会自动保存,但语言根本无法做到这一点。通过一些自定义foreach操作,它将调用您定义的函数:

int i;
foreach(s; splitter("whatever")) {
   // use s and i
   i++;
}
在那里,您可以
foreach(i,s){}
并从opApply定义中找出它。但对于范围,它会这样做:

int opApply(int delegate(int idx, string s) dg);
没有空间让范围定义第二个索引变量,也没有自动插入。这可能会在某一点上发生变化,但它到底会发生什么还没有定论,社区中也没有人急于这么做-添加您自己的int计数器变量很容易,所以这个限制并不是什么大问题,尽管它有时会让我们中的一些人感到烦恼。

将来()您将能够使用以下代码:

for(auto f = range.front; !range.empty; range.popFront())
import std.range: enumerate;

foreach(i, s; splitter("Hello world !").enumerate){
    writeln(i);
}