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

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

Source: https://habr.com/ru/post/J328208/


All Articles