我想要一个数字列表:
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
是产生数字范围(通用含义)的范围(因此是迭代器)。