Подтвердить что ты не робот

Как получить элементы списка по индексу в эликсире

{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

У меня есть следующая функция elixir, где я читаю файл /etc/hosts и пытаюсь разбить его по строкам с помощью String.split.

Затем я просматриваю список строк хостов и вызываю line_to_host (хост) для каждого. Метод line_to_host разбивает строку на " ", а затем я хочу установить переменную from и 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

Я просмотрел stackoverflow, elixir docs и googled о том, как получить элемент списка по определенному индексу. Я знаю, что есть head/tail, но должен быть лучший способ получить элементы списка.

elem(list, index) делает именно то, что мне нужно, но, к сожалению, он не работает с String.split.

Как получить элементы списка/кортежа по ID в elixir

4b9b3361

Ответ 1

Для этого можно использовать сопоставление шаблонов:

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

Возможно, вы хотите добавить опцию parts: 2, чтобы убедиться, что вы получите только две части в случае, если в строке больше одного места:

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

Существует также Enum.at/2, который отлично работает здесь, но является унииоматическим. Проблема с Enum.at заключается в том, что из-за реализации списка в Elixir необходимо пройти весь список до запрошенного индекса, чтобы он мог быть очень неэффективным для больших списков.


Изменить: здесь запрошенный пример с Enum.at, но я бы не использовал его в этом случае

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