Как отформатировать плоскую строку с целыми числами в эрланге?
В erlang я хочу отформатировать строку с целыми числами в ней, и я хочу, чтобы результат был сплющен. Но я получаю это:
io_lib:format("sdfsdf ~B", [12312]).
[115,100,102,115,100,102,32,"12312"]
Я могу получить желаемый результат, используя приведенный ниже код, но он действительно не элегантный.
lists:flatten(io_lib:format("sdfsdf ~B", [12312])).
"sdfsdf 12312"
Есть ли лучшее форматирование строк с целыми числами в них, чтобы они были плоскими? В идеале, используя только одну функцию?
2 ответа
Вы сглаживаете список, используя lists:flatten/1
как вы сделали в своем примере.
Если вы можете принять двоичный файл, list_to_binary/1
довольно эффективно:
1> list_to_binary(io_lib:format("sdfsdf ~B", [12312])).
<<"sdfsdf 12312">>
Тем не менее, вопрос, почему вам нужен плоский список в первую очередь. Если это просто косметика, она вам не нужна. io:format/1,2,3
и большинство других функций порта (gen_tcp
и т.д.) принимать так называемые глубокие списки ввода-вывода (вложенные списки с символами и двоичными файлами):
2> io:format([115,100,102,115,100,102,32,"12312"]).
sdfsdf 12312ok
Существует причина эффективности, что io_lib:format возвращает глубокие списки. В основном это сохраняет вызов спискам:flatten.
Спросите себя, почему вы хотите, чтобы список был сведен. Если вы собираетесь распечатать список или отправить его в порт или записать в файл, все эти операции обрабатывают глубокие списки.
Если вам действительно нужен какой-то плоский список по какой-то причине, просто сгладьте его. Или вы можете создать свой собственный формат my_io_lib:, который возвращает уплощенные списки, если вы считаете это важным.
(Если вы хотите сгладить список только по причинам отладки, то либо напечатайте строки с помощью ~ s, либо создайте выравниватель в модуле erlang с именем user_default
, Что-то вроде этого:
-module(user_default).
-compile(export_all).
%% either this:
fl(String) ->
lists:flatten(String).
%% or this:
pp(String) ->
io:format("~s~n", [String]).
Затем вы можете использовать fl/1 и print/1 в оболочке Erlang (если, конечно, на вашем пути будет user_default.beam).)