Я хочу отсортировать строки, прочитанные из stdin
по длине строки, после обрезки пробелов.Код работает, как и ожидалось.
import std.algorithm, std.array, std.stdio, std.string;
void main()
{
stdin
.byLineCopy
.map!(strip)
.array
.sort!((a, b) => a.length < b.length)
.each!writeln;
}
Однако, если я поменяю строку map
на строку array
,
void main()
{
stdin
.byLineCopy
.array
.map!(strip)
.sort!((a, b) => a.length < b.length)
.each!writeln;
}
Программа не скомпилируется со следующей ошибкой:
sort_lines.d(9): Error: template std.algorithm.sorting.sort cannot deduce function from argument types !((a, b) => a.length < b.length)(MapResult!(strip, string[])), candidates are:
/usr/include/dmd/phobos/std/algorithm/sorting.d(1852): std.algorithm.sorting.sort(alias less = "a < b", SwapStrategy ss = SwapStrategy.unstable, Range)(Range r) if ((ss == SwapStrategy.unstable && (hasSwappableElements!Range || hasAssignableElements!Range) || ss != SwapStrategy.unstable && hasAssignableElements!Range) && isRandomAccessRange!Range && hasSlicing!Range && hasLength!Range)
Failed: ["/usr/bin/dmd", "-v", "-o-", "sort_lines.d", "-I."]
Я не могу понять, почему.Разве функция карты не применяется к каждому элементу в диапазоне и не возвращает новый диапазон?Согласно документации, sort
требует, чтобы аргумент диапазона был произвольно доступен.Это причина?Если да, то какой тип диапазона возвращает map
?