web-dev-qa-db-ja.com

エリクサーのインデックスでリスト要素を取得する方法

_{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
_

/ etc/hostsファイルを読み取り、_String.split_を使用して行ごとに分割しようとする次のエリクサー関数があります。

次に、ホストの行リストをマップし、それぞれに対してline_to_Host(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、エリクサードキュメントを調べ、特定のインデックスでリスト要素を取得する方法についてGoogleで調べました。 _head/tail_があることは知っていますが、リスト要素を取得するより良い方法が必要です。

elem(list, index)は必要なことを正確に行いますが、残念ながら_String.split_では機能しません。

ElixirでIDによってリスト/タプル要素を取得する方法

29
Pascal Raszyk

そのためにパターンマッチングを使用できます。

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

parts: 2オプションを追加して、行に2つ以上のスペースがある場合に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)
30
Patrick Oscity