arrays - una - Cómo obtener elementos de la lista por índice en elixir
obtener el indice de un array php (1)
{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
Tengo la siguiente función de elixir donde leo el archivo / etc / hosts y trato de dividir línea por línea usando String.split
.
Luego mapeo a través de la lista de líneas de hosts y llamo a line_to_host (host) para cada uno. El método line_to_host divide la línea por " "
y luego quiero configurar la variable from
y 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
Miré a través de stackoverflow, el elixir docs y busqué en Google sobre cómo obtener un elemento de lista en un índice específico. Sé que hay head/tail
pero tiene que haber una mejor manera de obtener los elementos de la lista.
elem(list, index)
hace exactamente lo que necesito, pero desafortunadamente no funciona con String.split
.
Cómo obtener elementos de lista / tupla por ID en elixir
Puedes usar la coincidencia de patrones para eso:
[from, to] = String.split line, " "
Quizás desee agregar la opción parts: 2
para asegurarse de que solo obtendrá dos partes en caso de que haya más de un espacio en la línea:
[from, to] = String.split line, " ", parts: 2
También está Enum.at/2
, que funcionaría bien aquí pero es unidiomático. El problema con Enum.at
es que, debido a la implementación de la lista en Elixir, debe atravesar la lista completa hasta el índice solicitado, por lo que puede ser muy ineficiente para listas grandes.
Edición: aquí está el ejemplo solicitado con Enum.at
, pero no lo usaría en este caso
parts = String.split line, " "
from = Enum.at(parts, 0)
to = Enum.at(parts, 1)