d - Using std.algorithm.iteration.sum with Duration[]



为什么我不能将std.algorithm.iteration.sumDuration[]一起使用?

我认为我可以以与例如int[]相同的方式使用该sum

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

我有点理解编译错误,但我不明白为什么存在限制,因为对我来说,文档中没有任何解释。

我读过:

  • sum
  • Duration

不符合sum Duration[]约束:

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()

作为错误归档:https://issues.dlang.org/show_bug.cgi?id=19525

相关内容

  • 没有找到相关文章

最新更新