dlang карта! int в массив строк

getClass и getTitle возвращают тип string Очевидно, что возвращается другой массив, но я не уверен, правильно ли выводятся типы, так ли это?

Как это ошибка в D?
Я пробовал writeln(Array int) раньше, но почему-то это не работает с картой! струны

writeln(listChildren().map!(x=>getClass(x)));

[x"46 6F 72 65 67 72 6F 75 6E 64 53 74 61 67 69 6E 67 00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF"c, x"46 6F 72 65 67 72 6F 75 6E 64 53 74 61 67 69 6E 67 00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF"c, x"74 6F 6F 6C 74 69 70 73 5F 63 6C 61 73 73 33 32 00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF"c, ...]

writeln(listChildren().map!(x=>getTitle(x)));

["\0", "\0", "\0", "\0", "\0", "\0", "\0", "\0", "\0", "\0" , "\0", "\0", "\0", "\0", "\0", "geany.exe\0", "\0", "\0", x"4D 65 64 69 64 6F 72 20 64 65 20 6C 61 20 62 61 74 65 72 ED 61 00"c, "\0", "Всплывающее окно сети\0", "\0", "\0", "geany.exe\0" , "geany.exe\0", "geany.exe\0", "geany.exe\0", "geany.exe\0", "geany.exe\0", ...]

Примечание: когда я использую

listChildren().map!getClass.each!writeln;

Я получаю ожидаемые результаты, но мне нужно работать с предыдущей формой, чтобы составить новые значения.


person shuji    schedule 21.04.2017    source источник
comment
попробуйте добавить .to!(string[]).join("\n"), если каждый!writeln является ожидаемым результатом   -  person WebFreak001    schedule 22.04.2017
comment
Это работает! но что происходит, не может правильно написать массив строк? кстати это .map!(to!string).join("\n")   -  person shuji    schedule 22.04.2017
comment
он делает .to!string для аргумента, и массив преобразуется в строку примерно так: "[" ~ arr.each!(a => a.to!string).join(", ") ~ "]". На самом деле другого пути нет. Вы хотите каждую запись с новой строки? Вы хотите, чтобы они были разделены пространством, не разделены вообще? + Это может выглядеть как ошибка, если у вас есть пустые строки и ничего не выводится   -  person WebFreak001    schedule 22.04.2017
comment
О, хорошо, значения уже были возвращены в виде строки getClass и getTitle, но я ожидал, что writeln правильно напечатает массив, как это происходит с массивами int, без необходимости добавления объединения   -  person shuji    schedule 22.04.2017
comment
Однако он также печатает массивы целых чисел ([0, 1, 2, 3, ...])   -  person WebFreak001    schedule 22.04.2017


Ответы (1)


Проверьте следующий код:

auto s = [1, 2, 3].map!(a => a.to!string);
pragma(msg, typeof(s));

Вы можете видеть, что возвращаемый тип map — это MapResult, который можно использовать для повторения.

map — это ленивая функция, которая оценивает значение только тогда, когда оно запрошено, поэтому вам нужно использовать все элементы результата, чтобы получить то, что вам нужно.

Добавьте .array() после .map, чтобы использовать все элементы и преобразовать результат в массив, затем writeln их, вы получите тот же результат целочисленного массива.

writeln(listChildren().map!(x => getClass(x)).array());
person Qurashi    schedule 24.04.2017
comment
Нужно ли мне что-то импортировать, чтобы использовать .array()? я получаю Error: no property 'array' for type 'MapResult!(__lambda2, void*[])' - person shuji; 24.04.2017
comment
хорошо, я импортировал std.array:array, но я получаю тот же неформатированный вывод в строке [] - person shuji; 24.04.2017
comment
каков тип возврата getClass ? если его void* и вы собираетесь вернуть строку, просто верните строку - person Qurashi; 25.04.2017
comment
он возвращает строку d - person shuji; 25.04.2017