Могу ли я отключить печать списков маленьких целых чисел в виде строк в оболочке Erlang?
-
23-09-2019 - |
Вопрос
Оболочка Erlang "угадывает", является ли данный список строкой для печати, и печатает его таким образом для удобства. Можно ли отключить это "удобство"?
Решение
Вы можете отключить такое поведение с помощью shell:strings/1
функция начиная с Erlang R16B.
Просто помните, что это глобальная опция для всех оболочек узлов, и, возможно, было бы разумно установить ее обратно после завершения воспроизведения is shell в более длинных живых узлах.
Другие советы
Я не знаю, возможно ли изменить поведение оболочки по умолчанию, но вы можете, по крайней мере, правильно отформатировать свои выходные данные, используя ввод-вывод: формат.
Вот один из примеров:
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, вы можете использовать функцию оболочка:строки/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.Строка - это просто список целых чисел, поэтому оболочка не может отличить строку для печати от общего списка.Не знаю, является ли это ответом на ваш вопрос.