Я пытаюсь отфильтровать список строк, чтобы получить только те, длина которых больше единицы, используя следующий код:
import std.stdio;
import std.string;
import std.algorithm;
void main(){
auto slist = ["a","aa","b","bb","c","cc","dd",];
slist = slist.filter!(a => a.length>1); // does not work;
writeln(slist);
}
Однако он создает ошибку:
$ rdmd soq_map_filter_strlist.d
soq_map_filter_strlist.d(7): Error: cannot implicitly convert expression filter(slist) of type FilterResult!(__lambda1, string[]) to string[]
Failed: ["/usr/bin/dmd", "-v", "-o-", "soq_map_filter_strlist.d", "-I."]
Где проблема и как ее можно решить? Спасибо за вашу помощь.
filter
возвращает ленивый диапазон, который не может быть неявно преобразован обратно в string[]
. Вы можете либо присвоить его новой переменной, либо оценить его в массиве, используя std.array.array
:
slist = slist.filter!(a => a.length>1).array;
writeln(slist);
- или -
auto slist2 = slist.filter!(a => a.length>1);
writeln(slist2);
Вам нужно импортировать std.array
.
Да, теперь это работает. Я бы хотел, чтобы сообщение об ошибке сообщило мне об этом.
В некотором смысле это так cannot implicitly convert expression filter(slist) of type FilterResult!(__lambda1, string[]) to string[]
, но я понимаю ваше разочарование. У меня была такая же проблема несколько недель назад, и мне пришлось копаться в сообщениях на форуме, чтобы понять это.
Как вы ожидаете, что компилятор скажет вам «вам нужно импортировать std.array»??
Ваш первый вариант
slist = slist.filter!(a => a.length>1).array;
не работает:Error: no property array for type FilterResult!(__lambda1, string[])
. Второй вариантauto slist2 = slist.filter!(a => a.length>1);
работает.