to_stringを追加すると、Elixirコードの開発とデバッグが簡単になります

例を見てみましょう。空港と道順を含むサービスを作成します。



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}"
      
      





それだけです 読みやすいコード!



All Articles