如何将Result类型转换为有用的类型?

时间:2016-03-23 13:16:24

标签: range d

我想要一个数字列表:

auto nums = iota(0, 5000);

现在nums的类型为Result。它无法转换为int[],也不能用作int[]的替代品。

the docs如何真正使用iota作为范围并不是很清楚。我使用了错误的功能吗?在D中制作“范围”的方法是什么?

1 个答案:

答案 0 :(得分:11)

与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是一个范围(因此是一个迭代器),它产生了数字的范围(通用含义)。