IO.inspect
が超絶便利です。なぜならIO.inspect(x)
は x
をまんま返してくる からです。この意味を僕はつい先ほどまで知らなかった…。
例
どう便利なのか例を挙げましょう。
defmodule A do
def double_sum(list) do
list
|> Enum.map(&(&1 * 2))
|> Enum.reduce(0, &(&1 + &2))
end
end
こんなコードがあった時、list
に何が渡されてきたか確認したいことってままあります。そういう時は
defmodule A do
def double_sum(list) do
IO.inspect(list)
list
|> Enum.map(&(&1 * 2))
|> Enum.reduce(0, &(&1 + &2))
end
end
とすればいいんでしょうか。まあそれでもいいんです。が、こうもできます;
defmodule A do
def double_sum(list) do
list
|> IO.inspect # ***** ここに注目 *****
|> Enum.map(&(&1 * 2))
|> Enum.reduce(0, &(&1 + &2))
end
end
どうしてこういうことができるかというと、IO.inspect(x)
は x
をまんま返してくる からです。
これはすなわちパイプラインの途中に |> IO.inspect
を挟んでもコードの実行には全く影響しないことを意味します (コンソールに文字が出力されるのと幾分実行時間が長くなる点を除いては)。
さてでは、map
した後 reduce
前にリストがどうなっているか見たいとしましょう。普通に泥臭いやり方だと、
defmodule A do
def double_sum(list) do
doubled_list =
list
|> Enum.map(&(&1 * 2))
IO.inspect(doubled_list)
doubled_list
|> Enum.reduce(0, &(&1 + &2))
end
end
このように一度変数に代入してごちゃごちゃやることになりますが、もちろんこんなことをする必要はありません。こう書けます;
defmodule A do
def double_sum(list) do
list
|> Enum.map(&(&1 * 2))
|> IO.inspect # ***** ここに注目 *****
|> Enum.reduce(0, &(&1 + &2))
end
end
最終的にこの関数が何を返すか知りたい時はもちろん
defmodule A do
def double_sum(list) do
list
|> Enum.map(&(&1 * 2))
|> Enum.reduce(0, &(&1 + &2))
|> IO.inspect # ***** ここに注目 *****
end
end
と関数の末尾に |> IO.inspect
と書いてやればいいのです。IO.inspect(x)
は x
をまんま返してくる のですから。
結論
どうです? IO.inspect
は超絶便利でしょう。この感動を誰かに伝えたくて書きました。ひょっとすると半ば常識なのかもしれませんが、そんなことはどうでもいいですw
参考
inspect について調べてみた - Qiita パイプラインの途中に挟んで使えることが言及されています。わたしはその意味に全く気づかなかった…。その他様々なオプションが解説されています
ElixirのPipeに関する7のTips - Qiita ここにも真っ先に載っています