Почему мой iex возвращает '-C' или '-A', когда я запускаю эту функцию - PullRequest
0 голосов
/ 20 сентября 2018

Я уже некоторое время изучаю эликсир, но сегодня я столкнулся с чем-то, что полностью смутило меня.

Я сделал эту функцию фильтрации:

thingy = for a <- ["may", "lay", "45", "67", "bay", "34"], do: Integer.parse(a)
for {n, _} <- thingy, do: n

output: '-C"'

Совершенно неожиданный вывод, но все жеверсия ниже 'работает'

parseds = for i <- [ "10", "hot dogs", "20" ], do: Integer.parse(i)
for {n, _} <- parseds, do: n

output: [10, 20]

Однако, если я изменю числа на что-то вроде 45 и 65, я получу '-A' в результате.

Это только основные двоичные функции, позволяющие мнеот того, какие номера мне нравятся?

Ответы [ 2 ]

0 голосов
/ 20 сентября 2018

Это потому, что в Elixir, как и в Erlang, нет типа String

Что бы это ни значило.Струны, улыбки.Это так просто:

iex(4)> [45, 67, 34]
'-C"'

В iex список чисел интерпретируется как последовательность символов, где каждое число является числовым кодом для некоторого символа.Если вы посмотрите на диаграмму ASCII , вы увидите, что:

45 -> -
67 -> C
34 -> "

Посмотрите на это:

iex(5)> 'hi' == [104, 105]
true

В эликсире, [104, 105] и [45, 67, 34] называются чарлистами.Ярлык для создания списка [104, 105] - 'hi'.Это результат ужасной функции Erlang, но, поскольку Elixir может взаимодействовать с Erlang, существует необходимость в чарлистах.Charlist Elixir является эквивалентом строки Erlang, а строка Erlang эквивалентна списку чисел.

Предположим, что ваша программа Elixir выполняет кучу критических математических вычислений с результатом:

result = [76, 64, 78, 79]

и вы хотите отобразить эту информацию пользователю, чтобы он мог настроить параметры дефибриллятора, чтобы спасти жизнь пациента, поэтому вы делаете это:

IO.puts "Set the defibrillator dials to these numbers: #{result}"

Вот что увидит пользователь:

Set the defibrillator dials to these numbers: L@NO

Здесь умирает пациент.

0 голосов
/ 20 сентября 2018

Это потому, что Эликсир, как и Эрланг, не имеет внутреннего типа String .Строки в одинарных кавычках представлены в виде списков символов, и они обычно используются при работе с библиотеками Erlang.Когда вы даете Elixir список [45, 67, 34], он отображает его в виде списка символов ASCII 46, 67 и 34 ;-, C и ".

Если хотя бы один номер в вашем списке не представляет печатного символа, вы увидите список номеров.Поскольку 10 не отображается на печатный символ, во втором примере вы видите 10 и 20.

Важно отметить, что созданный вами список все еще внутренне представлен как[45, 67, 34] поэтому любые операции со списками, которые вы выполняете, будут работать в точности так, как вы ожидаете с вашими номерами.

...