2013-11-02 42 views
4

我不知道如何调用“..”运算符D.我已经看到了它:Dlang切片和数量范围

// 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?

回答

6

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

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

我敢肯定,在其他情况下,..生成类似iota的技术上是可行的,但D语言设计者此时所采用的方法是,如果可以在库中完成某些操作而不是语言,它应该在图书馆里完成,如果有的话,他们会后悔加入一些功能,而不是把它们放在图书馆里。

+3

以及在单项病例报告中也是如此:病例1:病例3:alsocovers病例2 –

+0

@ AdamD.Ruppe啊,是的。我忘了那些。我现在更新了我的答案以包含它们。 –