4

我不确定如何在 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?

4

2 回答 2

6

..仅用于切片、foreach和范围 case 语句。这些上下文都不需要创建任何类型的结构或列表来完成它的工作。切片基本上只是使用两个索引,并且foreach简单地降低到一个for带有计数器的循环,该计数器从第一个值开始并递增直到它到达第二个值。为了..在其他情况下工作,它需要降低为某种实际对象或从值生成某种列表,这要复杂得多(至少就实现而言)。所以,语言没有做任何这些。为了让它做你正在寻找的事情,编译器实际上必须能够生成范围,并且它所理解的关于范围的所有内容都是迭代它们所需的foreach.

std.range.iota实际上创建了一个结构,它是一个范围,不需要编译器或语言了解它的工作原理。因此,它可以用于需要对象来表示一系列值并且..不起作用的地方。

我确信在其他情况下..生成类似的东西在技术上是可能的iota,但是 D 语言设计者此时采取的方法是,如果可以在库而不是语言中完成某些事情,则应该在库,如果有的话,他们后悔为语言添加了一些特性而不是将它们放入库中。

于 2013-11-02T19:05:22.433 回答
1

在当前语法中,它是句法糖

Slice 表达式foreach 范围表达式都显式使用..运算符,

授予创建导致 std.range.itoa 的显式 IntRangeExpression 会很方便

于 2013-11-02T19:01:45.617 回答