技術メモ

プログラミングとか電子工作とか

Elixir入門(第二十一章 Debugging)

f:id:ysmn_deus:20190122112104p:plain

どうも、靖宗です。
残すところあと数個、今回はDebuggingです。

IO.inspect/2

デバッグに使用されるIO.inspect/2という関数があるようです。
とりあえずサンプルで分かる!

iex(5)> (1..10) \
...(5)> |> IO.inspect \
...(5)> |> Enum.map(fn x -> x * 2 end) \
...(5)> |> IO.inspect \
...(5)> |> Enum.sum \
...(5)> |> IO.inspect
1..10
[2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
110
110

とりあえずIO.inspect/2無し版も実行

iex(6)> (1..10) \
...(6)> |> Enum.map(fn x -> x * 2 end) \
...(6)> |> Enum.sum
110

まだElixirのコードを見たわけではありませんが、|>を多用するなら確かに便利そうです。
これが無いといちいち変数に入れてIO.putsするはめになりそうです。

IO.inspect/2はアリティにあるように2個引数を受けるはずです。
1個はパイプで受けたものですが、もう一個はオプションでラベルをつけれるようです。

[1, 2, 3]
|> IO.inspect(label: "before")
|> Enum.map(&(&1 * 2))
|> IO.inspect(label: "after")
|> Enum.sum

これが

before: [1, 2, 3]
after: [2, 4, 6]

こうなると。iexで実行するなら厳密には最後のEnum.sumも表示されるとは思います。

IO.inspect/2binding()を組み合わせて使うと現在のスコープの変数がキーワードリストとして出力されるようです。

def some_fun(a, b, c) do
  IO.inspect binding()
  ...
end

some_fun(:foo, "bar", :baz)として実行すると

[a: :foo, b: "bar", c: :baz]

となると。
他にもオプションがあるようですが、とりあえず先に進みます。

IEx.pry/0 and IEx.break!/2

ブレイクポイントとか決めてそこから動的にデバッグしたい(その場での変数の値とかみたい)場合にはIEx.pry/0を使うそうで。

def some_fun(a, b, c) do
  require IEx; IEx.pry
  ...
end

おそらくコレが呼び出された段階でそこからiexが起動する?
正直このへんはよく分からんので後に回す。
たぶん開発してる時に使いたくなって見直す事になるだろう・・・ IEx.break!/2というのもあるみたいだけど同様にスルー。

Debugger

iex -S mix

で起動するっぽいんだけど起動しない。めんどいのでスルー。
どうせVSCodeとかでいけるやろ(適当)
ErlangVMとかがちゃんと入ってればグラフィカルなデバッグツールが起動する?

ほかにもチョロチョロかかれてるんだけど、Debuggerが起動しないことにはどうしようもないのでとりあえず今回はこんなところで。