Ajouter un nouvel élément à la liste

J'ai essayé 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 ai-je obtenu sur la 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, plutôt vers la valeur 3, Comment puis-je boucler la liste?

30
demandé sur zero_coding 2016-02-20 23:53:16

5 réponses

L'opérateur ++ est pour concaténer deux listes, alors peut-être que ce que vous voulez faire pour ajouter un nouvel élément est de le mettre dans une liste. Ensuite, je pense que vous devriez ajouter le 3 dans une autre liste:

Iex (2) > l = [3,5,7,7,8] ++ [3]

[3, 5, 7, 7, 8, 3]

31
répondu Salvador Medina 2016-02-20 21:06:22

Il suffit de suivre les documents Elixir pour ajouter un élément à une liste (et garder 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]

Https://hexdocs.pm/elixir/List.html

36
répondu Chilian 2017-05-09 04:38:56

Premier: [1, 2 / 3] est la notation pour une Liste incorrecte .

Deuxième: pour faire L'énumération.chaque fois que vous essayez de faire avec une liste incorrecte, le code ressemblerait à ceci:

La correspondance avec des listes appropriées/incorrectes est en conséquence facile. Donc un longueur fonction len pour les listes appropriées:

Len([_|L]) -> 1 + len(T); len([]) -> 0. où nous correspondons explicitement pour la résiliation de []. Si une liste incorrecte est donnée, cela générera un erreur. Tandis que la fonction last_tail qui renvoie la dernière queue d'un list peut également gérer des listes incorrectes:

Last_tail([_|L]) -> last_tail(T); last_tail(Queue) -> Queue.
%Correspondra à n'importe quelle queue

C'est, bien sûr, Code Erlang de @rvirding. Traduit en élixir 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 le laisse comme un exercice pour vous de comprendre comment faire cela avec une énumération.chacun.

6
répondu Onorio Catenacci 2017-05-23 12:34:39

Rejoindre par Enum.concat

Exemple:

var new_elem = 5
Enum.concat([1, 2, 3], [new_elem])
// result: [1, 2, 3, 5]
0
répondu hana9 2018-09-17 14:15:55

Le " I " signifie que la liste est divisée en tête et en queue comme ceci [tête / queue]. Si vous faites correspondre la liste de cette façon, vous pouvez manipuler les deux parties de la liste et utiliser l'opérateur ++ pour la concaténation.

-4
répondu Sasha Fonseca 2016-02-20 21:29:17