【发布时间】:2016-03-23 13:16:24
【问题描述】:
我想要一个数字列表:
auto nums = iota(0, 5000);
现在nums 的类型为Result。它不能转换为int[],也不能用作int[] 的直接替代品。
the docs 并不清楚如何实际使用 iota 作为范围。我使用了错误的功能吗? D中“范围”的制作方法是什么?
【问题讨论】:
我想要一个数字列表:
auto nums = iota(0, 5000);
现在nums 的类型为Result。它不能转换为int[],也不能用作int[] 的直接替代品。
the docs 并不清楚如何实际使用 iota 作为范围。我使用了错误的功能吗? D中“范围”的制作方法是什么?
【问题讨论】:
iota 和 Phobos 中的许多函数一样,是惰性的。结果是一个承诺,当你需要它时会给你你需要的东西,但实际上还没有计算出任何值。您可以将其传递给 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]
如果您需要“真实”的值列表,请使用 std.array 中的 array 对其进行去懒化:
int[] myArray = iota(0, 5000).array;
作为旁注,请注意,range 这个词在 D 中具有特定含义,它不是“数字范围”,而是描述了一个迭代器模型,很像 python 中的生成器。 iota 是一个范围(因此是一个迭代器),它产生了一个数字范围(一般含义)。
【讨论】: