デバッグするに便利な関数としてIO.inspectとIO.putsがあります
IO.inspect
入力した結果を画面に表示して、そのまま入力結果を結果として返してくれる便利な関数です
- この例の場合Enum.mapの直後の結果を画面に表示します
iex(1)> 1..10 |> Enum.map(fn x -> x * 2 end) |> IO.inspect() |> Enum.sum()
[2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
110
- 関数の間ごと入れると状態変化がわかりやすくてデバッグに便利です
※Enum.shuffle()は結果意味ありませんが途中経過のサンプルとして記述してます
iex(1)> 1..10 |> Enum.map(fn x -> x * 2 end) |> IO.inspect() |> Enum.shuffle() |> IO.inspect() |> Enum.sum()
[2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
[6, 14, 10, 4, 2, 20, 8, 12, 16, 18]
110
- 個数が多い場合はすべて表示できないこともあります
iex(1)> 1..100 |> Enum.map(fn x -> x * 2 end) |> IO.inspect() |> Enum.sum
[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42,
44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82,
84, 86, 88, 90, 92, 94, 96, 98, 100, ...]
10100
- 上記の対処方法
IO.inspectにlimit: :infinity
を指定すると制限なしに表示できます
iex(1)> 1..100 |> Enum.map(fn x -> x * 2 end) |> IO.inspect(limit: :infinity) |> Enum.sum
[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42,
44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82,
84, 86, 88, 90, 92, 94, 96, 98, 100, 102, 104, 106, 108, 110, 112, 114, 116,
118, 120, 122, 124, 126, 128, 130, 132, 134, 136, 138, 140, 142, 144, 146, 148,
150, 152, 154, 156, 158, 160, 162, 164, 166, 168, 170, 172, 174, 176, 178, 180,
182, 184, 186, 188, 190, 192, 194, 196, 198, 200]
10100
IO.puts
文字列を表示するに便利です
返却値は:okを返す為、次の関数へパイプは出来ません
\n
を改行として表示できます
iex(1)> "abc\ncde\nxyz" |> IO.puts
abc
cde
xyz
:ok
- IO.inspectだと…
iex(1)> "abc\ncde\nxyz" |> IO.inspect()
"abc\ncde\nxyz"
"abc\ncde\nxyz"
そのまま\n
が表示されます
ひと工夫してみる
沢山デバッグ情報があると区別が大変なので
下記のような関数を作ってみます
iex(1)> defmodule Debug do
...(1)> def print(v, msg) do
...(1)> IO.inspect("↓↓↓↓↓#{msg}↓↓↓↓↓")
...(1)> IO.inspect(v ,limit: :infinity)
...(1)> IO.inspect("↑↑↑↑↑#{msg}↑↑↑↑↑")
...(1)> v
...(1)> end
...(1)> end
作った関数を検証してみる
iex(2)> 1..100 |> Enum.map(fn x -> x * 2 end) |> Debug.print("map") |> Enum.shuffle() |> Debug.print("shuffle") |> Enum.sum()
"↓↓↓↓↓map↓↓↓↓↓"
[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42,
44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82,
84, 86, 88, 90, 92, 94, 96, 98, 100, 102, 104, 106, 108, 110, 112, 114, 116,
118, 120, 122, 124, 126, 128, 130, 132, 134, 136, 138, 140, 142, 144, 146, 148,
150, 152, 154, 156, 158, 160, 162, 164, 166, 168, 170, 172, 174, 176, 178, 180,
182, 184, 186, 188, 190, 192, 194, 196, 198, 200]
"↑↑↑↑↑map↑↑↑↑↑"
"↓↓↓↓↓shuffle↓↓↓↓↓"
[58, 16, 70, 68, 190, 102, 122, 170, 180, 30, 104, 6, 56, 74, 8, 108, 2, 158,
14, 26, 162, 32, 148, 116, 182, 62, 80, 100, 52, 152, 168, 72, 196, 138, 98,
60, 126, 18, 160, 88, 150, 142, 136, 176, 124, 192, 36, 34, 76, 24, 184, 134,
106, 186, 82, 10, 66, 12, 96, 112, 200, 48, 172, 156, 46, 78, 4, 28, 86, 174,
128, 92, 64, 54, 20, 42, 90, 114, 110, 164, 146, 188, 44, 84, 120, 154, 50, 38,
198, 140, 94, 40, 178, 144, 130, 22, 132, 194, 166, 118]
"↑↑↑↑↑shuffle↑↑↑↑↑"
10100
デバッグした箇所の区別ができました