web-dev-qa-db-fra.com

Comment obtenir des éléments de liste par index dans l'élixir

{status, body} = File.read("/etc/hosts")
if status == :ok do
    hosts = String.split body, "\n"
    hosts = Enum.map(hosts, fn(Host) -> line_to_Host(host) end)
else
    IO.puts "error reading: /etc/hosts"
end

J'ai la fonction d'élixir suivante où je lis le fichier/etc/hosts et j'essaie de le diviser ligne par ligne en utilisant String.split.

Ensuite, je mappe la liste des hôtes en ligne et j'appelle line_to_Host (hôte) pour chacun. La méthode line_to_Host divise la ligne par " ", Puis je veux définir les variables from et to:

def line_to_Host(line) do
    data = String.split line, " "
    from = elem(data, 0) // doesn't work
    to = elem(data, 1) // doesn't work either
    %Host{from: from, to: to}
end

J'ai regardé à travers stackoverflow, les documents d'élixir et recherché sur la façon d'obtenir un élément de liste à un index spécifique. Je sais qu'il y a head/tail Mais il doit y avoir un meilleur moyen d'obtenir des éléments de liste.

elem(list, index) fait exactement ce dont j'ai besoin mais malheureusement cela ne fonctionne pas avec String.split.

Comment obtenir des éléments de liste/tuple par ID dans l'élixir

29
Pascal Raszyk

Vous pouvez utiliser la correspondance de motifs pour cela:

[from, to] = String.split line, " "

Vous souhaitez peut-être ajouter parts: 2 option pour vous assurer que vous n'obtiendrez que deux parties au cas où il y aurait plus d'un espace dans la ligne:

[from, to] = String.split line, " ", parts: 2

Il y a aussi Enum.at/2 , ce qui fonctionnerait bien ici mais n'est pas automatique. Le problème avec Enum.at est qu'en raison de l'implémentation de la liste dans Elixir, il doit parcourir la liste entière jusqu'à l'index demandé, ce qui peut être très inefficace pour les grandes listes.


Edit: voici l'exemple demandé avec Enum.at, mais je ne l'utiliserais pas dans ce cas

parts = String.split line, " "
from = Enum.at(parts, 0)
to = Enum.at(parts, 1)
30
Patrick Oscity