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

デバッグするに便利な関数としてIO.inspectとIO.putsがあります

# IO.inspect
入力した結果を画面に表示して、そのまま入力結果を結果として返してくれる便利な関数です

* この例の場合Enum.mapの直後の結果を画面に表示します
```Elixir
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()は結果意味ありませんが途中経過のサンプルとして記述してます

```Elixir
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
```
---

* 個数が多い場合はすべて表示できないこともあります
```Elixir
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`を指定すると制限なしに表示できます


```Elixir
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`を改行として表示できます

```Elixir
iex(1)> "abc\ncde\nxyz" |> IO.puts 
abc
cde
xyz
:ok
```

* IO.inspectだと…

```Elixir
iex(1)> "abc\ncde\nxyz" |> IO.inspect()
"abc\ncde\nxyz"
"abc\ncde\nxyz"
```
そのまま`\n`が表示されます


# ひと工夫してみる
沢山デバッグ情報があると区別が大変なので
下記のような関数を作ってみます

```Elixir
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
```
----
作った関数を検証してみる

```Elixir
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
```
デバッグした箇所の区別ができました