J'essayais d'ajouter un nouvel élément dans une liste comme suit:
iex(8)> l = [3,5,7,7,8] ++ 3
[3, 5, 7, 7, 8 | 3]
iex(9)> l
[3, 5, 7, 7, 8 | 3]
Pourquoi suis-je arrivé en 5ème position comme
8 | 3
Qu'est-ce que cela signifie?
Et comment puis-je ajouter un nouvel élément à la liste?
--------Mise à jour --------
J'essaie de boucler la liste comme suit:
iex(2)> l = [1,2] ++ 3
[1, 2 | 3]
iex(3)> Enum.each(l, fn(x) -> IO.puts(x) end)
1
2
** (FunctionClauseError) no function clause matching in Enum."-each/2-lists^foreach/1-0-"/2
(elixir) lib/enum.ex:604: Enum."-each/2-lists^foreach/1-0-"(#Function<6.54118792/1 in :erl_eval.expr/5>, 3)
(elixir) lib/enum.ex:604: Enum.each/2
Puisque le pointeur du nombre 2 ne pointe pas vers une liste, mais plutôt vers la valeur 3, comment puis-je boucler la liste?
L'opérateur ++ sert à concaténer deux listes. Ce que vous voulez peut-être faire pour ajouter un nouvel élément est peut-être de le placer dans une liste. Ensuite, je pense que vous devriez ajouter le dans une autre liste:
iex (2)> l = [3,5,7,7,8] ++ [3]
[3, 5, 7, 7, 8, 3]
Suivez simplement la documentation Elixir pour ajouter un élément à une liste (et gardez les performances à l'esprit =)):
iex> list = [1, 2, 3]
iex> [0 | list] # fast
[0, 1, 2, 3]
iex> list ++ [4] # slow
[1, 2, 3, 4]
D'abord: [1, 2 | 3] est la notation pour liste impropre .
Deuxièmement: Pour faire l'énumération. Chaque fois que vous essayez de faire une liste incorrecte, le code ressemblerait à ceci:
La correspondance avec des listes appropriées/incorrectes est par conséquent facile. Donc, une fonction de longueur len pour les listes appropriées:
len ([_ | T]) -> 1 + len (T); len ([]) -> 0. où nous correspondons explicitement pour le [] final. Si une liste incorrecte est donnée, cela générera une erreur. Alors que la fonction last_tail qui retourne la dernière queue d'une liste peut également gérer des listes incorrectes:
last_tail ([_ | T]) -> last_tail (T); last_tail (queue) -> queue.
% Correspond à n'importe quelle queue
C'est bien sûr code Erlang de @rvirding . Traduit en Elixir et traduit pour faire l'impression que vous donnez dans votre exemple, cela ressemblerait à ceci:
iex(6)> defmodule T do
...(6)> defp print([h|t]) do
...(6)> IO.puts(h)
...(6)> print(t)
...(6)> end
...(6)> defp print(t) do
...(6)> IO.puts(t)
...(6)> end
...(6)> def print_improper_list(il), do: print(il)
...(6)> end
iex:6: warning: redefining module T
{:module, T,
<<70, 79, 82, 49, 0, 0, 5, 136, 66, 69, 65, 77, 69, 120, 68, 99, 0, 0, 0, 161, 131, 104, 2, 100, 0, 14, 101, 108, 105, 120, 105, 114, 95, 100, 111, 99, 115, 95, 118, 49, 108, 0, 0, 0, 4, 104, 2, ...>>,
{:print_improper_list, 1}}
iex(7)> T.print_improper_list([1,2,3|4])
1
2
3
4
:ok
Je vous laisse le soin de comprendre comment faire cela avec un Enum.each.
Rejoindre par Enum.concat
Exemple:
iex> new_elem = 5
iex> Enum.concat([1, 2, 3], [new_elem])
[1, 2, 3, 5]