list - antiguos - personajes de cartoon network 2018
Listas de Elixir interpretadas como listas de personajes (1)
Estoy comenzando con Elixir. Estoy escribiendo algunas pruebas usando ExUnit para funciones simples de Enumerable que estoy implementando, 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 stdout, veo la lista de caracteres ''/a/b/t''
. ¿Por qué sucede este tipo de cosas?
Elixir tiene dos tipos de cadenas: binarios (comillas dobles) y listas de caracteres (comillas simples). La última variante se hereda de Erlang y se representa internamente como una lista de enteros, que se correlacionan con los puntos de código de la cadena.
Cuando utiliza funciones como inspect
y IO.inspect
, Elixir intenta ser inteligente y formatea una lista de enteros como una cadena para facilitar la lectura. Sin embargo, en algunos casos terminas con una cadena sin sentido solo porque todos los enteros en tu lista son puntos de código válidos. Por ejemplo, los caracteres A a Z se representan como los números enteros 65 a 90 en ASCII.
iex> IO.inspect [65, 66, 67]
''ABC''
Si desea imprimir una lista sin formato, puede usar las charlists: :as_lists
opción charlists: :as_lists
. Para obtener una lista completa de opciones, iex
y escriba h Inspect.Opts
.
iex> IO.inspect [65, 66, 67], charlists: :as_lists
[65, 66, 67]
Con Elixir <1.4, puedes usar char_lists: false
.
Por cierto, este no es el único caso en el que Elixir oculta los bloques de construcción subyacentes, también ocurre con los binarios (cadenas de comillas dobles) y las estructuras.
La razón más profunda para 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 sola cadena entrecomillada, 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 bloques de construcción básicos que vienen con el lenguaje.