_{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によってリスト/タプル要素を取得する方法
そのためにパターンマッチングを使用できます。
[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)