Могу ли я отключить печать списков маленьких целых чисел в виде строк в оболочке Erlang?

StackOverflow https://stackoverflow.com/questions/2348087

  •  23-09-2019
  •  | 
  •  
Это было полезно?

Решение

Вы можете отключить такое поведение с помощью 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.Строка - это просто список целых чисел, поэтому оболочка не может отличить строку для печати от общего списка.Не знаю, является ли это ответом на ваш вопрос.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top