LoginSignup
5
2

More than 3 years have passed since last update.

IO.inspect が超絶便利な件

Last updated at Posted at 2019-08-10

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

参考

5
2
1

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
5
2