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