【问题标题】:Using std.algorithm.iteration.sum with Duration[]将 std.algorithm.iteration.sum 与 Duration[] 一起使用
【发布时间】:2018-12-29 08:22:39
【问题描述】:

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

我想我可以像使用 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);
}

【问题讨论】:

    标签: d phobos


    【解决方案1】:

    这里的问题是 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-04
      • 1970-01-01
      • 2013-07-21
      • 2023-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多