defmodule Airport do defstruct [:id, :name] end defmodule Direction do defstruct [:origin, :destination] def example do madrid = %Airport{id: "MAD", name: "Madrid"} riga = %Airport{id: "RIX", name: "Riga"} %Direction{origin: riga, destination: madrid} end end
これまでのところ、とても良い。 さて、私たちはクッキーを食べました。 最も人気のある目的地のリスト?

最初に、小さなテストリストを作成し、読み取り不能なシートを取得します。
popular = Enum.map(1..5, fn _ -> Direction.example end) # => # [%Direction{destination: %Airport{id: "MAD", name: "Madrid"}, # origin: %Airport{id: "RIX", name: "Riga"}}, # %Direction{destination: %Airport{id: "MAD", name: "Madrid"}, # origin: %Airport{id: "RIX", name: "Riga"}}, # %Direction{destination: %Airport{id: "MAD", name: "Madrid"}, # origin: %Airport{id: "RIX", name: "Riga"}}, # %Direction{destination: %Airport{id: "MAD", name: "Madrid"}, # origin: %Airport{id: "RIX", name: "Riga"}}, # %Direction{destination: %Airport{id: "MAD", name: "Madrid"}, # origin: %Airport{id: "RIX", name: "Riga"}}]
読みやすくする:
defimpl String.Chars, for: Airport do def to_string(airport) do "#{airport.name} (#{airport.id})" end end defimpl String.Chars, for: Direction do def to_string(direction) do "#{direction.origin} → #{direction.destination}" end end
そして、明確でわかりやすい結論が得られます。
Enum.each(popular, fn(x) -> IO.puts(x) end) # => # Riga (RIX) → Madrid (MAD) # Riga (RIX) → Madrid (MAD) # Riga (RIX) → Madrid (MAD) # Riga (RIX) → Madrid (MAD) # Riga (RIX) → Madrid (MAD)
今真剣に
開発中に、変数の内容を分析する必要がある場合があります。 内部表現は正確ですが、常に読みやすいとは限りません。 そのような場合、構造を文字列に変換するようにElixirに教えることができます。 これを行うには、
to_string
プロトコル
String.Chars
一部として
to_string
関数を定義します。
追加のボーナスとして、補間が自動的に機能し始めます。 空港に
to_string
を実装しないと、これは機能しません。
"#{direction.origin} → #{direction.destination}"
それだけです 読みやすいコード!