我不确定如何在D中调用".."运算符.我已经看到它:
// Slicing
int[] t = list[3..$];
// Looping
foreach (x; 1..10) {}
Run Code Online (Sandbox Code Playgroud)
但似乎我不能在一些"逻辑"的地方使用它,例如:
int[] test = 1..N;
auto harmonic_serie = map!"1 / a"(1..1000);
Run Code Online (Sandbox Code Playgroud)
".."只是语法糖,只能用于切片和循环吗?我们是否被迫使用不太可读的std.range.iota?
..仅用于切片foreach和范围的case语句.这些上下文都不需要创建任何类型的结构或列表来执行它所做的事情.切片基本上只是采用并使用两个索引,并且foreach简单地降低到for具有计数器的循环,该计数器从第一个值开始并递增直到它到达第二个.为了..在其他环境中工作,需要将其降低到某种实际对象或者从值生成某种列表,这要复杂得多(至少就实现而言).所以,这种语言没有做到这一点.为了使它能够像您正在寻找的那样,编译器必须实际上能够生成范围,并且它对范围的理解是根据它们进行迭代所需要的.foreach.
std.range.iota实际上创建了一个结构,它是一个范围,并不要求编译器或语言理解它的工作原理.因此,它可以在您需要一个对象来表示一系列值并且..不起作用的地方使用.
我确信在技术上可以..生成像iota其他情况一样的东西,但D语言设计者在这一点上采取的方法是,如果可以在库中完成某些事情而不是语言,那么应该在库,如果有的话,他们后悔在语言中添加一些功能而不是将它们放入库中.