Listas de elixir interpretadas como listas de caracteres.
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?
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 inspect
y 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_lists
opción. Para obtener una lista completa de opciones, inicie iex
y 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.
Si bien la respuesta de @Patrick es absolutamente correcta, también puedes configurarla IEx
para que se muestre siempre charlists
como listas regulares en lugar de llamar manualmente inspect
cada 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.exs
su ruta de inicio, de modo que la configuración se aplique a cada sesión IEx en su sistema.
Para deshabilitar este comportamiento para su entorno, cree un ~/.iex.exs
archivo para aplicar siempre la configuración:
# .iex.exs
IEx.configure(inspect: [charlists: :as_lists])
Esto evita la necesidad de proporcionar la opción de inspect
ejecutar IEx.configure
manualmente cada vez.
También puede tener scripts separados .iex
por directorio , si desea anular la configuración global para un proyecto específico.