Почему мой iex возвращает «-C» или «-A» при запуске этой функции

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

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

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'.

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


person Peter    schedule 19.09.2018    source источник
comment
Взгляните на stackoverflow.com/questions/ 30037914/ и stackoverflow.com/questions/52153483/   -  person Nathan Ripert    schedule 20.09.2018
comment
Возможный дубликат списков Elixir, интерпретируемых как списки символов   -  person Adam Millerchip    schedule 20.09.2018


Ответы (2)


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

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

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

person Glitch Desire    schedule 19.09.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, необходимы списки символов. Список символов Elixir эквивалентен строке Erlang, а строка Erlang эквивалентна списку чисел.

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

result = [76, 64, 78, 79]

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

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

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

Set the defibrillator dials to these numbers: L@NO

Пациент умирает здесь.

person 7stud    schedule 20.09.2018