Могу ли я отключить печатные листы небольших целых чисел в виде строк в оболочке Erlang?
Оболочка Erlang "угадывает" , является ли данный список печатаемой строкой и печатает его таким образом для удобства. Это "удобство" может быть инвалиды?
Ответы
Ответ 1
Вы можете отключить такое поведение с помощью shell:strings/1
функции, начиная с Erlang R16B.
Просто помните, что это опция глобальная для всех оболочек node, и было бы разумно ее вернуть после завершения игры, это оболочка в более длинных живых узлах.
Ответ 2
Я не знаю, возможно ли изменить поведение оболочки по умолчанию, но вы можете, по крайней мере, правильно отформатировать свой вывод, используя 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()
или что-то в этом роде, которое хорошо форматирует все.
Ответ 3
Я стараюсь сделать это, добавив атом в свой список в оболочке.
например:
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()] будет печатать "правильную вещь (ish) большую часть времени"
Ответ 4
С 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]}
Ответ 5
Нет, нет возможности отключить его. Лучшая альтернатива, которую я нахожу, - либо явно распечатать значение в запросе (с помощью io:format
), либо после этого сделать: io:format("~w\n", [v(-1)])
.
Ответ 6
Я не думаю, что вы можете это предотвратить.
Превращение атома похоже на kludge - он изменяет вашу исходную строку.
Я обычно использую списки: flatten (String), чтобы принудительно привязать его к строке - особенно возвращаемое значение io_lib: format() не всегда печатается как строка. Использование списков: flatten() на нем делает его одним.
Я использую следующий "C-стиль":
sprintf(Format) ->
sprintf(Format, []).
sprintf(Format, Args) ->
lists:flatten(io_lib:format(Format, Args)).
Ответ 7
Проблема заключается в том, что строка не является типом в Erlang. Строка - это всего лишь список целых чисел, поэтому оболочка не может отличить печатную строку от общего списка. Не знаю, ответит ли этот вопрос на ваш вопрос.