Rubyにおけるプリントデバッグのすゝめ

※ 別に勧めてない ※

皆さん!プリントデバッグ使ってますか!使ってないですよね、どうせ皆さんデバッガでかっこよく問題解決しているんでしょう。だけれども、私はデバッガを使いこなすことができない程度の能力しか持っていないので、99.99%ぐらいの問題はプリントデバッグで地道に値をトレースし、頑張って解決しています。

そんな私のTipsです。

識別子付きで出力

ただ単に変数をpで出力するようなケースだと、次のように出力したい事がありますね。

p "hoge -> #{hoge}"

ただこれは入力が面倒。自分がパット見で区別できればいいので次のようにします。

p [:hoge, hoge]

こうすると、[:hoge, 1]のように出力されるので都合がいいです。

区切り線の表示

いろんな値を出力するときには欠かせない区切り線。
単純に出力する場合は次のようにするかもしれません

p '**************************************'
p hoge
p '**************************************'

だけどこれはちょっと入力が面倒臭い。なので、次のように書きます

p ?**88

?の累乗に見えますが、これは*を88個出力しています。rubyの文字リテラルってやつを利用しています。
区切り線にはなんの文字を使ってもいいので、?-*100とかして、-を100個出力とかでもいいんでしょうが、コードの見た目が?**88のほうがかっこいい!のでほかの文字は使いません。

メソッドチェーンの途中を出力

この方法が必要になるケースはかなり少ないんですが・・。
たとえば意味のない例ですが次の様なメソッドのなげー連鎖がある場合。

b = a.map(&:sono1).map(&:sono2)

このsono1の直後の状態を出力したい時があるんじゃないでしょうか。
tappみたいなgemを使っているならそれでいいのですが、それを使わない環境で手軽にテストしたい場合は、次のようにするでしょうか。

_a = a.map(&:sono1)
p _a
b = _a.map(&:sono2)

でもでも、変数を増やしたり、メソッドチェーンをぶった切って途中でpを使ったり、書き換え量が多くて副作用がうっかり発生するかもしれない。
なので、次のように出力はチェーンに組み込みます。

b = a.map(&:sono1).tap(&method(:p)).map(&:sono2)
# もしくは ↓
b = a.map(&:sono1).tap{|_a|p _a}.map(&:sono2)

どちらかは、好みですね。メソッドチェーンをぶった切って一時的な変数に格納する方法よりは副作用が少ない方法だと思ってます。

タイトルとURLをコピーしました