我想要一个数字列表:

auto nums = iota(0, 5000);


现在,nums的类型为Result。无法将其强制转换为int[],并且不能用作int[]的直接替代。

the docs不清楚如何实际使用iota作为范围。我使用了错误的功能吗?在D中建立“范围”的方式是什么?

最佳答案

就像Phobos中的许多功能一样,iota是懒惰的。结果是一种承诺,可在需要时为您提供所需的东西,但实际上尚未计算任何值。您可以将其传递给foreach语句,例如:

import std.range: iota;
foreach (i ; iota(0, 5000)) {
    writeln(i);
}


不过,您不需要简单的foreach:

foreach (i ; 0..5000) {
    writeln(i);
}


除此之外,很希望iota本身是有用的。懒惰还可以实现转换的无成本链接:

/* values are computed only once in writeln */
iota(5).map!(x => x*3).writeln;
// [0, 3, 6, 9, 12]


如果您需要一个“实数”值列表,请使用array中的std.array使其模糊化:

int[] myArray = iota(0, 5000).array;


作为附带说明,请注意,单词range在D中具有特定的含义,它不是“数字范围”,而是描述了迭代器模型,非常类似于python中的生成器。 iota是产生数字范围(通用含义)的范围(因此是迭代器)。

09-28 14:03