Listas de elixir interpretadas como listas de caracteres.

Resuelto George Taveras asked hace 9 años • 3 respuestas

Estoy empezando con Elixir. Estoy escribiendo algunas pruebas usando ExUnit para funciones enumerables simples que estoy implementando yo mismo, sin usar el módulo Enum estándar.

En mis pruebas, descubro que cada vez que hago referencia a la lista [7, 8, 9], una vez que se imprime en la salida estándar, veo la lista de caracteres '\a\b\t'. ¿Por qué sucede este tipo de cosas?

George Taveras avatar May 05 '15 02:05 George Taveras
Aceptado

Elixir tiene dos tipos de cadenas: binarias (comillas dobles) y listas de caracteres (comillas simples). La última variante se hereda de Erlang y se representa internamente como una lista de números enteros, que se asignan a los puntos de código de la cadena.

Cuando usas funciones como inspecty IO.inspect, Elixir intenta ser inteligente y formatear una lista de números enteros como una cadena para facilitar la lectura. Sin embargo, en algunos casos terminas con una cadena sin sentido simplemente porque todos los números enteros en tu lista son puntos de código válidos. Por ejemplo, los caracteres de la A a la Z se representan como números enteros del 65 al 90 en ASCII.

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

Si desea imprimir una lista sin formato, puede utilizar la charlists: :as_listsopción. Para obtener una lista completa de opciones, inicie iexy escriba h Inspect.Opts.

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

Con Elixir < 1.4, puedes usarchar_lists: false .

Por cierto, este no es el único caso en el que Elixir le oculta los bloques de construcción subyacentes, también sucede con los binarios (cadenas entre comillas dobles) y las estructuras.

La razón más profunda de esto es que Elixir y Erlang no tienen tipos definidos por el usuario, por lo que no hay forma de distinguir entre una lista y una cadena entre comillas simples, porque ambas son solo listas. Sin embargo, esto también puede ser una fortaleza en otras situaciones. Por ejemplo, nos permite serializar trivialmente cualquier estructura de datos en Elixir y Erlang, porque solo se puede construir a partir de los componentes básicos que vienen con el lenguaje.

Patrick Oscity avatar May 04 '2015 20:05 Patrick Oscity

Si bien la respuesta de @Patrick es absolutamente correcta, también puedes configurarla IExpara que se muestre siempre charlistscomo listas regulares en lugar de llamar manualmente inspectcada vez:

iex> IEx.configure(inspect: [charlists: :as_lists])
# => :ok

iex> [65, 66, 67]
# => [65, 66, 67]

iex> 'ABC'
# => [65, 66, 67]

Aquí hay una lista completa de las opciones admitidas .

También puede colocar esta línea en ~/.iex.exssu ruta de inicio, de modo que la configuración se aplique a cada sesión IEx en su sistema.

Sheharyar avatar Nov 26 '2018 03:11 Sheharyar

Para deshabilitar este comportamiento para su entorno, cree un ~/.iex.exsarchivo para aplicar siempre la configuración:

# .iex.exs
IEx.configure(inspect: [charlists: :as_lists])

Esto evita la necesidad de proporcionar la opción de inspectejecutar IEx.configuremanualmente cada vez.

También puede tener scripts separados .iexpor directorio , si desea anular la configuración global para un proyecto específico.

Adam Millerchip avatar Jan 06 '2021 01:01 Adam Millerchip