2013-11-02 29 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啊,是的。我忘了那些。我現在更新了我的答案以包含它們。 –