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