どうも、靖宗です。
残すところあと数個、今回は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/2
とbinding()
を組み合わせて使うと現在のスコープの変数がキーワードリストとして出力されるようです。
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とかでいけるやろ(適当)
ErlangのVMとかがちゃんと入ってればグラフィカルなデバッグツールが起動する?
ほかにもチョロチョロかかれてるんだけど、Debuggerが起動しないことにはどうしようもないのでとりあえず今回はこんなところで。