Использование std.algorithm.iteration.sum с Duration [] - PullRequest
0 голосов
/ 29 декабря 2018

Почему я не могу использовать 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);
}

1 Ответ

0 голосов
/ 30 декабря 2018

Проблема здесь в sum с нулевыми аргументами (кроме аргумента UFCS) пытается создать начальный элемент с нулевым значением, вызывая конструктор Duration(0).Хотя Duration(0) Сорта имеет смысл, каково значение Duration(1) - одна минута?Одну секунду?Один эон?По этой причине Duration(0) просто не компилируется.Причина, по которой fold работает, заключается в том, что он всегда берет первый элемент в качестве своего начального числа.Недостаток в том, что он выбрасывает, когда диапазон, на котором он работает, пуст.

Теперь вы можете не слишком беспокоиться об этом, и просто хотите, чтобы durations.sum() работал.Не волнуйтесь - есть способ.Вам нужно будет передать начальное значение sum() как durations.sum(Duration.zero).

Подано как ошибка: https://issues.dlang.org/show_bug.cgi?id=19525

...