3

コンソールにいるときのrubyコードの実行フローを監視したいと思います。たとえば、私がこれを持っている場合:

def process
  hash = {a:1,b:2}
  hash.values.map!{|e| e+1}
end

そして、私がタイプするとき、私はコンソールでこのようなものを見たいですprocess

hash = {a:1,b:2}
=> {:a=>1, :b=>2}
hash.values.map!{|e| e+1}
=> [2, 3]

このようなことをするのに便利な方法はありますか?

$VERBOSE何もしないようで$DEBUG、冗長すぎるとは逆のようです。

4

3 に答える 3

5

あなたは「トレース」機能について話している。

shellやgood-ol'GWBasicなどの一部の言語には、現在実行中の行を示すフラグがあります。Rubyの$DEBUG出力は、コードからではなく、それを探して現在の状態をダンプしたり、トレースをオンにしたりするgemからの情報過多でいっぱいになる可能性があります。

多くの人putsは、開発/テスト中に、コードに自分がどこにいるかを示す指標を表示させるためにコードを振りかけます。その場合は、出力をボトルネックにし、簡単にオン/オフを切り替える方法として作成することをお勧めします。また、フラグを使用して、デバッグするかどうかを確認します。OptionParserを使用--debugして、コマンドラインで渡すフラグを作成することもできます。メソッドを使用することのもう1つの優れた副作用は、出力をファイルにリダイレクトして、tail発生した出力を監視し、後でトリアージに使用するのが簡単なことです。

もう1つの方法は、コードをデバッガーにロードして、トレースするように指示することです。コードのすべてのステップが表示されます。これは非常に冗長ですが、詳細は良好です。また、特定のポイントまで実行するように指示して、コードを調べて掘り下げ、必要に応じてIRBにドロップすることもできます。

個人的には、昔ながらのアセンブリ言語に慣れているので、デバッガーに慣れているので、Rubyをよく使用します。特定の場所まで実行して停止するように指示するのは簡単です。またはinclude 'debugger'; debugger、コードに埋め込んでその時点で停止することもできます。そこに到達したら、何が起こっているかを確認して続行し、ステートメントに再びcヒットするまでプログラムを実行させることができます。debuggerデバッガーは非常に強力で、何が起こっているのかを知りたいときに適した選択的な拡大鏡であることがわかりました。

Rubyでのデバッグ」には、役立つヒントがたくさんあります。


編集:

私はRubyを調べるというAlexDの提案が好きset_trace_funcです。私はそれを使用していません(そして、率直に言ってそれを忘れました)が、それはアプリで素晴らしいトレースを設定するための良い方法でしょう。小さなコードで、オン/オフを切り替えて、呼び出されることを制御できるため、特定のクラスまたは条件を指定して選択的に出力するように設定できますproc

于 2012-11-08T19:22:53.017 に答える
4

1つのオプションは、set_trace_func(http://apidock.com/ruby/Kernel/set_trace_func)を使用して、実行時に各行を出力するフックを設定することです。の内部に関する多くの情報であなたを圧倒するかもしれないことに注意してくださいirb

もう1つのオプションは、のソースコードを掘り下げて、irb実行時に各行を印刷するオプションを追加することです。

于 2012-11-08T19:25:20.527 に答える
2

詮索好きな宝石を試しましたか?コードrequire 'pry'; binding.pry内に配置して、スクリプトを実行します。あなたはそれを置いた場所にルビーコンソールを持っているでしょう。多分それはあなたが探しているものです。

それ以外の場合は、rubyデバッガーを確認する必要があります。

于 2012-11-08T19:24:25.993 に答える