Подтвердить что ты не робот

Списки эликсиров интерпретируются как списки char

Я только начинаю с Elixir. Я пишу некоторые тесты, используя ExUnit для простых функций Enumerable, которые я реализую самостоятельно, без использования стандартного модуля Enum.

В моих тестах я обнаружил, что всякий раз, когда я ссылаюсь на список [7, 8, 9], как только он печатается в stdout, я вижу список char '\a\b\t'. Почему такое происходит?

4b9b3361

Ответ 1

Elixir имеет два типа строк: двоичные файлы (двойные кавычки) и списки символов (одиночные кавычки). Последний вариант наследуется от Erlang и внутренне представляется в виде списка целых чисел, которые сопоставляются с кодовыми точками строки.

Когда вы используете такие функции, как inspect и IO.inspect, Elixir пытается быть умным и форматировать список целых чисел в виде строки для удобства чтения. Однако в некоторых случаях вы получаете бессмысленную строку только потому, что все целые числа в вашем списке являются действительными кодовыми точками. Например, символы от A до Z представлены как целые числа от 65 до 90 в ASCII.

iex> IO.inspect [65, 66, 67]
'ABC'

Если вам нравится печатать необработанный список, вы можете использовать опцию charlists: :as_lists. Для полного списка опций запустите iex и введите h Inspect.Opts.

iex> IO.inspect [65, 66, 67], charlists: :as_lists
[65, 66, 67]

С Elixir < 1.4, вы можете использовать char_lists: false.

Кстати, это не единственный случай, когда Elixir скрывает от вас базовые строительные блоки, это также происходит с бинарниками (двойными кавычками) и структурами.

Более глубокая причина этого заключается в том, что у Elixir и Erlang нет пользовательских типов, поэтому нет возможности различать список и одну строку с кавычками, потому что оба являются просто списками. Однако это также может быть сильным в других ситуациях. Например, это позволяет нам тривиально сериализовать любую структуру данных в Elixir и Erlang, поскольку она может быть построена только из основных строительных блоков, которые поставляются с языком.