7
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

IO.inspectとIO.putsを使い分けてみる

Last updated at Posted at 2022-06-11

デバッグするに便利な関数として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

デバッグした箇所の区別ができました

7
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?