web-dev-qa-db-fra.com

Comment imprimer les valeurs de tableau d'une carte dans Elixir?

Nouveau dans Elixir depuis Ruby et j'essaie d'imprimer les valeurs du tableau d'une carte en utilisant le code suivant:

map-script.ex

list = [0, 1]
map = %{0 => [1, 2], 1 => [2, 3]}

Enum.each list, fn n ->
  IO.puts map[n]
end

Sortie:

^A^B
^B^C

Qu'est-ce que je fais mal? L'élixir ressemble à Ruby mais il se comporte différemment ....

29
Nona

Tu devrais utiliser IO.inspect au lieu de IO.puts pour imprimer la représentation interne d'une valeur:

iex> IO.puts [1, 2]
^A^B                          # prints "^A^B"
:ok                           # return value of IO.puts

iex> IO.inspect [1, 2]
[1, 2]                        # prints "[1, 2]"
[1, 2]                        # return value of IO.inspect

Cependant, vous pouvez toujours rencontrer des problèmes avec certaines valeurs spéciales:

iex> IO.inspect [97, 98]
'ab'                          # prints "'ab'"
'ab'                          # return value of IO.inspect

Pour expliquer ce comportement, nous devons comprendre le fonctionnement des chaînes dans Elixir. Il existe deux types de chaînes. Chaînes binaires (guillemets doubles) et listes de caractères (guillemets simples). En interne, ceux-ci sont construits à partir de primitives plus simples. Les chaînes binaires sont construites à partir de binaires et les listes de caractères sont construites à partir de listes:

iex> "ab"                    # a binary string
"ab"

iex> <<97, 98>>              # the same string in binary syntax
"ab"

iex> 'ab'                    # a character list
'ab'

iex> [97, 98]                # the same character list in list syntax
'ab'

Cela peut sembler déroutant au début, mais cela se produit en raison de deux choses. Tout d'abord, il n'y a pas de type de chaîne intégré, comme nous l'avons vu, les chaînes sont construites à partir d'autres types primitifs. Deuxièmement, il n'y a pas de types définis par l'utilisateur dans Elixir. Ainsi, lorsque Elixir voit une liste avec uniquement des entiers, il essaie de l'imprimer sous forme de chaîne pour plus de commodité. Cependant, sous le capot, ce n'est encore qu'une liste d'entiers.

Dans les exemples ci-dessus, 97 et 98 représente les points de code unicode pour les caractères a et b afin qu'ils soient affichés sous forme de chaîne, même si vous utilisez IO.inspect.

Vous pouvez maintenant voir pourquoi il a imprimé ^A^B dans vos exemples - ce ne sont que caractères de contrôle de l'encodage ASCII , qui se trouvent être représentés par les points de code 1 et 2.

Cependant, vous pouvez passer l'option char_lists: :as_lists afin d'imprimer des listes brutes sans tenter d'effectuer une telle conversion:

iex> IO.inspect [97, 98], char_lists: :as_lists
[97, 98]                                         # prints '[97, 98]'
'ab'                                             # Iex still shows the return value as 'ab'

Si vous ouvrez iex et tapez h Inspect.Opts, vous verrez qu'Elixir fait ce genre de chose avec d'autres valeurs également, en particulier les structures et les binaires.

64
Patrick Oscity