Pryでのデバッグ

概要

REPLの一種であるPryについて説明し、プログラムをdebugaするためにインストールして使用する方法について説明します。

目標

  1. PryがIRBよりも柔軟なREPLである方法を説明します。
  2. コンピュータにPryをインストールします(IDEユーザー用に既にインストールされています)。
  3. バインディングを使用してプログラムをデバッグします。ファイルの本文内でこじ開けます。

REPLとは何ですか?

IRB(Interactive Ruby)を使用して、すでにREPLsを導入しています。REPLは、Read、Evaluate、Print、Loopの略です。 これは、ユーザーの入力を受け取り、それを評価し、結果をユーザーに返す対話型のprogrammingenvironmentです。

Rubyは、すでに使用しているIRBである独自のREPLでインストールします。ターミナルにirbと入力するたびに、REPLに入ります。

Pryは、いくつかの機能が追加された別のRuby REPLです。 IRBに入るとき、真新しい相互環境に入っているyouare。 IRB内で再生したいコードは、IRBに書き込むか、irbにコピーして貼り付ける必要があります。 一方、Pryは、プログラムに注入できるREPLのようなものです。

PryはIRBよりもはるかに柔軟です。 Pryライブラリをインストールしたら(Prygemを介して—インストールを少し説明します)、コード内のどこでもbinding.pryを使用できます。

.. “結合”とは何ですか?

Bindingは組み込みのrubyクラスで、そのオブジェクトは現在のスコープ(変数、メソッドなど)のコンテキストをカプセル化できます。)、およびそのコンテキストの外で使用するためにそれらを保持します。

binding.pryを呼び出すことは、基本的に、ファイルの外部からコードの現在のバインディングorcontextに”詮索”しています。したがって、コードにbinding.pry行を配置すると、その行は実行時に(プログラムが実行されるときに)解釈されます。 インタプリタがその行にヒットすると、プログラムは実際にフリーズし、binding.pry行を追加したところで、プログラムの途中に存在するREPLに端末が変わります。

見てみましょう。 このリポジトリには、pry_is_awesome.rbという名前のファイルが表示されます。

  1. このリポジトリをフォークしてクローンします。

  2. ホームディレクトリ(cd ~inyour terminal)に移動してコンピュータにPryをインストールし、gem install pryを実行します。 (IDEで作業している場合は、これを行う必要はありません。)

  3. のコードを見てくださいlib/pry_is_awesome.rb

次のコードが表示されます:

require 'pry'def prying_into_the_method inside_the_method = "We're inside the method" puts inside_the_method puts "We're about to stop because of pry!" binding.pry this_variable_hasnt_been_interpreted_yet = "The program froze before it could read me!" puts this_variable_hasnt_been_interpreted_yetendprying_into_the_method

ここでは、pryを使用してメソッドを定義し、そのメソッドを呼び出すために行う必要があるpryを必要としています。

このリポジトリのディレクトリで、ターミナルでrubylib/pry_is_awesome.rbと入力してファイルを実行します。 今、あなたの端末を見てください。 あなたはこれのようなものを見るべきです:

 3: def prying_into_the_method 4: inside_the_method = "We're inside the method" 5: puts inside_the_method 6: puts "We're about to stop because of pry!" 7: binding.pry => 8: this_variable_hasnt_been_interpreted_yet = "The program froze before it could read me!" 9: puts this_variable_hasnt_been_interpreted_yet 10: end pry(main)>

プログラムが実行されると、プログラムが凍結され、REPL insideyourプログラムの内部になりました。 あなたは基本的にちょうど時間を停止しました! それはどのようにクールですか?

端末のpryコンソールで、変数名inside_the_methodを入力し、enterキーを押します。 あなたはの戻り値が表示されるはずです"We're inside the method"

あなたはyourbindingを配置したメソッド内のデータを探索することができます。

さて、ターミナルのpryコンソールで、変数名this_variable_hasnt_been_interpreted_yetを入力します。 戻り値nilが表示されるはずです。 これは、7行目に配置したバインディングが実際に7行目のプログラムを凍結し、呼び出したばかりの変数がまだ解釈されていないためです。その結果、私たちのREPLはそれについて知りません。

今、ターミナルで、exitと入力すると、pryコンソールを離れると、プログラムは実行され続けます。

命令パートII:Pryを使用して

をデバッグするPry内のコードを探索することに加えて、変数を操作してコードを試してみることもできます。 これは、Pryがデバッグに本当に役立つ場所です。 あなたがするべきことをしていないメソッドを持っている場合は、テキストエディタでmakingchangesを作り、それが働くまで何度もテストを実行するのではなく、コードにバインディングを入れて試してみることができます。 問題を解決する方法を理解したら、テキストエディターのコードをaccordingly更新します。

一緒に例を見てみましょう。 フォークしてコンピュータにクローンしたこのリポジトリには、ファイルpry_debugging_spec.rbを含むspecフォルダが表示されます。 これはファイルlib/pry_debugging.rbのテストです。

pry_debugging.rbには、壊れたメソッドがあります。 learn testを実行して、failingテストを確認します。 次のように表示されます:

 1) #plus_two takes in a number as an argument and returns the sum of that number and 2 Failure/Error: expect(plus_two(3)).to eq(5) expected: 5 got: 3 (compared using ==) # ./spec/pry_debugging_spec.rb:6:in `block (2 levels) in <top (required)>'

それで何が起きたの? 2行目(Failure/Errorで始まる行)では、テストがplus_twoメソッドを呼び出し、3を引数として渡していることがわかります。 その下には、テストが5が返されることを期待していることがわかりますが、代わりに3が返されています。 Rubyのメソッドの戻り値は、一般的にthemethodの最後の行の値であり、この場合はnumであることを覚えておいてください。:したがって、メソッドが2行目のnumに2を追加している間、それは更新されていないようですnum。 これを確認するために使用できるように、spec/pry_debugging_spec.rbファイルの先頭にPry requiredがあります。 その行の直後に、コードにbinding.pryを配置しましょう:

def plus_two(num) num + 2 binding.pry numend

次に、テストスイートを再度実行し、Pryコンソールにドロップします。 あなたの端末は次のようになります:

From: /Users/sophiedebenedetto/Desktop/Dev/Ruby-Methods_and_Variables/pry-readme/lib/pry_debugging.rb @ line 4 Object#plus_two: 1: def plus_two(num) 2: num + 2 3: binding.pry => 4: num 5: end pry(#<RSpec::ExampleGroups::PlusTwo>)>

Pryプロンプトでnumと入力して、現在の戻り値を確認しましょう。 あなたはこのようなものを見るべきです:

 pry(#<RSpec::ExampleGroups::PlusTwo>)> num=> 3 pry(#<RSpec::ExampleGroups::PlusTwo>)>

pryコンソール内の変数の値を確認することで、numがまだ3と等しく、その結果、メソッドが3を返していることを確認できます。

メソッドがexpectedwayで動作するように、2行目のコードをどのように変更できますか? 2183>変数の値を更新して、それ自身と2の合計に等しくなるようにする必要があります。 あなたのPryコンソールの中で遊んでください:youthinkが必要に応じてnumを更新するコードを試してから、numの値を確認して動作しているかどうかを確認してく それを理解したら、ターミナルにexitと入力してPryを取得し、テキストエディタでコードを更新し、テストを再実行してspassingを確認することができます。 binding.pryを削除するようにしてください!

Pryを使用するのに少し時間がかかることがありますので、少し混乱しても心配しないでください。 より複雑なメソッドとデータ構造を使い始めると、それは非常に便利なツールになることがわかります。