Elenchi di elisir interpretati come elenchi di caratteri

Sto appena iniziando con Elixir. Sto scrivendo alcuni test usando ExUnit per semplici funzioni Enumerabili che sto implementando da solo, senza usare il modulo Enum standard.

Nei miei test trovo che ogni volta che faccio riferimento all’elenco [7, 8, 9] , una volta stampato in stdout, vedo la lista di caratteri '\a\b\t' . Perché succede questo genere di cose?

L’elisir ha due tipi di stringhe: binari (doppi) e elenchi di caratteri (quotati singoli). Quest’ultima variante è ereditata da Erlang ed è internamente rappresentata come una lista di numeri interi, che mappano i codepoint della stringa.

Quando si utilizzano funzioni come IO.inspect e IO.inspect , Elixir tenta di essere intelligente e formattare un elenco di numeri interi come stringa per una facile leggibilità. Tuttavia, in alcuni casi si finisce con una stringa priva di senso solo perché tutti i numeri interi nell’elenco sono validi punti codepoint. Ad esempio, i caratteri da A a Z sono rappresentati come gli interi da 65 a 90 in ASCII.

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

Se ti piace stampare un elenco non charlists: :as_lists , puoi utilizzare l’ charlists: :as_lists dei charlists: :as_lists . Per un elenco completo di opzioni, iex fuoco su iex e digita h Inspect.Opts .

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

Con Elixir <1.4, puoi usare char_lists: false .

A proposito, questo non è l’unico caso in cui Elixir nasconde gli elementi costitutivi sottostanti, si verifica anche con i binari (stringhe con doppie virgolette) e le strutture.

La ragione più profonda per questo è che Elixir ed Erlang non hanno tipi definiti dall’utente, quindi non c’è modo di distinguere tra una lista e una singola stringa quotata, perché entrambi sono solo elenchi. Tuttavia, questo può anche essere un punto di forza in altre situazioni. Ad esempio, ci permette di serializzare banalmente qualsiasi struttura di dati in Elixir ed Erlang, perché può essere costruita solo dai blocchi di base forniti con la lingua.