Pryでのデバッグ
概要
REPLの一種であるPryについて説明し、プログラムをdebugaするためにインストールして使用する方法について説明します。
目標
- PryがIRBよりも柔軟なREPLである方法を説明します。
- コンピュータにPryをインストールします(IDEユーザー用に既にインストールされています)。
- バインディングを使用してプログラムをデバッグします。ファイルの本文内でこじ開けます。
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
という名前のファイルが表示されます。
-
このリポジトリをフォークしてクローンします。
-
ホームディレクトリ(
cd ~
inyour terminal)に移動してコンピュータにPryをインストールし、gem install pry
を実行します。 (IDEで作業している場合は、これを行う必要はありません。) -
のコードを見てください
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を使用するのに少し時間がかかることがありますので、少し混乱しても心配しないでください。 より複雑なメソッドとデータ構造を使い始めると、それは非常に便利なツールになることがわかります。