如何将结果类型变成有用的东西?

How do I turn the Result type into something useful?

我想要一个数字列表:

auto nums = iota(0, 5000);

现在 nums 的类型是 Result。它不能转换为 int[],也不能用作 int[].

的直接替代品

the docs 中不太清楚如何实际使用 iota 作为范围。我使用了错误的功能吗? "range"在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]

如果您需要 "real" 值列表,请使用 std.array 中的 array 对其进行去模糊化处理:

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

作为旁注,请注意 range 这个词在 D 中有一个特定的含义,它不是 "range of numbers" 但描述了一个迭代器模型,很像 python 中的生成器. iota 是一个范围(因此是一个迭代器),它产生了一个数字范围(通常的含义)。