我想要一个数字列表:
auto nums = iota(0, 5000);
现在nums
的类型为Result
。它无法转换为int[]
,也不能用作int[]
的替代品。
the docs如何真正使用iota
作为范围并不是很清楚。我使用了错误的功能吗?在D中制作“范围”的方法是什么?
答案 0 :(得分:11)
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
是一个范围(因此是一个迭代器),它产生了数字的范围(通用含义)。