Оболочка Erlang "угадывает", является ли заданный список печатаемой строкой, и выводит его таким образом для удобства . Можно ли отключить это «удобство»?
Могу ли я отключить печать списков небольших целых чисел в виде строк в оболочке Erlang?
Ответы (7)
Вы можете отключить такое поведение с помощью shell:strings/1
function, начиная с Erlang R16B.
Просто помните, что это глобальная опция для всех оболочек узлов, и может быть целесообразно установить ее обратно после завершения воспроизведения оболочки в долгоживущих узлах.
Я не знаю, возможно ли изменить поведение оболочки по умолчанию, но вы можете, по крайней мере, правильно отформатировать свой вывод, используя io:format.
Вот пример:
1> io:format("~p~n", [[65, 66, 67]]).
"ABC"
ok
2> io:format("~w~n", [[65, 66, 67]]).
[65,66,67]
ok
А так как шелл предназначен только для экспериментов/сопровождения, io:format()
должно быть как минимум достаточно для вашего реального приложения. Возможно, вам также следует подумать о написании собственного метода форматирования/печати, например. formatPerson()
или что-то в этом роде, которое все прекрасно форматирует.
Я обычно делаю это, добавляя атом в свой список в оболочке.
Например:
Eshell V5.7.4 (abort with ^G)
1> [65,66,67].
"ABC"
2> [a|[65,66,67]].
[a,65,66,67]
также может быть [a,65,66,67], конечно. но [a|fun_that_returns_a_list()] будет печатать "правильное (нужно) большую часть времени"
Начиная с Erlang/OTP R16B вы можете использовать функцию shell:strings/1, чтобы включить или выключить это. Обратите внимание, что это также влияет на печать вещей, которые на самом деле должны быть строками, например "foo"
в следующем примере:
1> {[8,9,10], "foo"}.
{"\b\t\n","foo"}
2> shell:strings(false).
true
3> {[8,9,10], "foo"}.
{[8,9,10],[102,111,111]}
Нет, отключить его невозможно. Лучшая альтернатива, которую я нахожу, - это либо явно распечатать значение в запросе (с io:format
), либо постфактум сделать: io:format("~w\n", [v(-1)])
.
Я не думаю, что вы можете предотвратить это. Добавление атома кажется кладжом - оно изменяет исходную строку.
Обычно я использую lists:flatten(String) для преобразования его в строку, особенно возвращаемое значение io_lib:format() не всегда печатается как строка. Использование lists:flatten() делает его одним.
Я использую следующий «C-стиль»:
sprintf(Format) ->
sprintf(Format, []).
sprintf(Format, Args) ->
lists:flatten(io_lib:format(Format, Args)).
Проблема в том, что строка не является типом в Erlang. Строка — это просто список целых чисел, поэтому оболочка не может отличить печатную строку от общего списка. Не знаю, если это ответ на ваш вопрос.