我不确定如何在 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?
我不确定如何在 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?
..
仅用于切片、foreach
和范围 case 语句。这些上下文都不需要创建任何类型的结构或列表来完成它的工作。切片基本上只是使用两个索引,并且foreach
简单地降低到一个for
带有计数器的循环,该计数器从第一个值开始并递增直到它到达第二个值。为了..
在其他情况下工作,它需要降低为某种实际对象或从值生成某种列表,这要复杂得多(至少就实现而言)。所以,语言没有做任何这些。为了让它做你正在寻找的事情,编译器实际上必须能够生成范围,并且它所理解的关于范围的所有内容都是迭代它们所需的foreach
.
std.range.iota
实际上创建了一个结构,它是一个范围,不需要编译器或语言了解它的工作原理。因此,它可以用于需要对象来表示一系列值并且..
不起作用的地方。
我确信在其他情况下..
生成类似的东西在技术上是可能的iota
,但是 D 语言设计者此时采取的方法是,如果可以在库而不是语言中完成某些事情,则应该在库,如果有的话,他们后悔为语言添加了一些特性而不是将它们放入库中。