使用 std.algorithm.iteration.sum 和 Duration[]
Using std.algorithm.iteration.sum with Duration[]
为什么我不能将 std.algorithm.iteration.sum
与 Duration[]
一起使用?
我想我可以像使用 sum
一样使用int[]
:
int[] ints = [40, 27, 5];
int intSum = ints.sum();
assert(intSum == 72);
但是我得到了一个意外的(至少对我来说是意外的)编译错误:
/usr/include/dmd/phobos/std/algorithm/iteration.d(5885): Error: struct `core.time.Duration` member this is not accessible
so_002.d(11): Error: template instance `std.algorithm.iteration.sum!(Duration[])` error instantiating
我有点理解编译错误,但我不明白为什么存在限制,因为对我而言,文档中没有任何内容解释这一点。
我已阅读:
是否Duration[]
符合sum
的约束:
auto sum(R)(R r)
if (isInputRange!R && !isInfinite!R && is(typeof(r.front + r.front)));
还是我忽略了什么?
解决方法很简单 - 请改用 fold
。
import std.algorithm : fold, sum;
import std.datetime : Duration, minutes;
void main()
{
Duration[] durations = [40.minutes, 27.minutes, 5.minutes];
// Unexpected compilation error:
// /usr/include/dmd/phobos/std/algorithm/iteration.d(5885): Error: struct `core.time.Duration` member this is not accessible
// so_002.d(11): Error: template instance `std.algorithm.iteration.sum!(Duration[])` error instantiating
// auto durationSum = durations.sum();
// fold works as expected
Duration durationSum = durations.fold!((a, b) => a + b);
assert(durationSum == 72.minutes);
}
这里的问题是 sum
参数为零(UFCS arg 除外)试图通过调用构造函数 Duration(0)
创建值为零的种子元素。虽然 Duration(0)
有点道理,但 Duration(1)
的价值是多少 - 一分钟?一秒?一万年?因此,Duration(0)
根本无法编译。 fold
起作用的原因是它总是将第一个元素作为它的种子。缺点是当它操作的范围为空时它会抛出。
现在,您可能不太关心这些,只想 durations.sum()
工作。别担心 - 有办法。您必须将种子值作为 durations.sum(Duration.zero)
.
传递给 sum()
为什么我不能将 std.algorithm.iteration.sum
与 Duration[]
一起使用?
我想我可以像使用 sum
一样使用int[]
:
int[] ints = [40, 27, 5];
int intSum = ints.sum();
assert(intSum == 72);
但是我得到了一个意外的(至少对我来说是意外的)编译错误:
/usr/include/dmd/phobos/std/algorithm/iteration.d(5885): Error: struct `core.time.Duration` member this is not accessible
so_002.d(11): Error: template instance `std.algorithm.iteration.sum!(Duration[])` error instantiating
我有点理解编译错误,但我不明白为什么存在限制,因为对我而言,文档中没有任何内容解释这一点。
我已阅读:
是否Duration[]
符合sum
的约束:
auto sum(R)(R r)
if (isInputRange!R && !isInfinite!R && is(typeof(r.front + r.front)));
还是我忽略了什么?
解决方法很简单 - 请改用 fold
。
import std.algorithm : fold, sum;
import std.datetime : Duration, minutes;
void main()
{
Duration[] durations = [40.minutes, 27.minutes, 5.minutes];
// Unexpected compilation error:
// /usr/include/dmd/phobos/std/algorithm/iteration.d(5885): Error: struct `core.time.Duration` member this is not accessible
// so_002.d(11): Error: template instance `std.algorithm.iteration.sum!(Duration[])` error instantiating
// auto durationSum = durations.sum();
// fold works as expected
Duration durationSum = durations.fold!((a, b) => a + b);
assert(durationSum == 72.minutes);
}
这里的问题是 sum
参数为零(UFCS arg 除外)试图通过调用构造函数 Duration(0)
创建值为零的种子元素。虽然 Duration(0)
有点道理,但 Duration(1)
的价值是多少 - 一分钟?一秒?一万年?因此,Duration(0)
根本无法编译。 fold
起作用的原因是它总是将第一个元素作为它的种子。缺点是当它操作的范围为空时它会抛出。
现在,您可能不太关心这些,只想 durations.sum()
工作。别担心 - 有办法。您必须将种子值作为 durations.sum(Duration.zero)
.
sum()