Debugging mit Pry

Übersicht

Wir behandeln Pry, eine Art REPL, und besprechen, wie es installiert und zum Debuggen eines Programms verwendet wird.

  1. Erklären Sie, wie Pry eine flexiblere REPL als IRB ist.
  2. Installieren Sie Pry auf Ihrem Computer (für IDE-Benutzer bereits installiert).
  3. Debuggen Sie ein Programm mithilfe der Bindung.hebeln Sie in den Körper Ihrer Datei.

Was ist eine REPL?

Sie wurden bereits mit IRB (Interactive Ruby) in REPLs eingeführt.REPL steht für Read, Evaluate, Print, Loop. Es handelt sich um eine interaktive Programmierumgebung, die die Eingaben eines Benutzers entgegennimmt, auswertet und das Ergebnis an den Benutzer zurückgibt.

Ruby installiert mit seiner eigenen REPL, die IRB ist, die Sie bereits verwendet haben.Jedes Mal, wenn Sie irb in Ihr Terminal eingeben, geben Sie eine REPL ein.

Was ist Pry?

Pry ist eine weitere Ruby-REPL mit einigen zusätzlichen Funktionen. Wenn Sie IRB betreten, betreten Sie eine brandneue interaktive Umgebung. Jeder Code, den Sie in IRB spielen möchten, müssen Sie in IRB schreiben oder kopieren und in IRB einfügen. Pry hingegen ist wie eine REPL, die Sie in Ihr Programm einfügen können.

Pry ist weitaus flexibler als IRB. Sobald Sie die Pry-Bibliothek installiert haben (über das Prygem—wir werden die Installation kurz durchgehen), können Sie an einer beliebigen Stelle in Ihrem Code ein binding.pry .

Warten Sie… Was ist ‚binding‘?

Binding ist eine integrierte Ruby-Klasse, deren Objekte den Kontext Ihres aktuellen Bereichs (Variablen, Methoden usw.) kapseln können.), und behalten sie für die Verwendung außerhalb dieses Kontexts.

Das Aufrufen von binding.pry ist im Wesentlichen ’neugierigen‘ in die aktuelle Bindung orcontext des Codes, von außerhalb Ihrer Datei.

Wenn Sie also die Zeile binding.pry in Ihren Code einfügen, wird diese Zeile zur Laufzeit interpretiert (wenn Ihr Programm ausgeführt wird). Wenn der Interpreter diese Zeile trifft, friert Ihr Programm tatsächlich ein und Ihr Terminal wird zu einer REPL, die genau in der Mitte Ihres Programms vorhanden ist, wo immer Sie die Zeilebinding.pry hinzugefügt haben.

Werfen wir einen Blick darauf. In diesem Repository sehen Sie eine Datei mit dem Namenpry_is_awesome.rb.

Anleitung Teil I

  1. Forken und klonen Sie dieses Repository.

  2. Installieren Sie Pry auf Ihrem Computer, indem Sie zu Ihrem Home-Verzeichnis (cd ~ in Ihrem Terminal) navigieren und gem install pry ausführen. (Sie müssen dies nicht tun, wenn Sie in der IDE arbeiten.)

  3. Schauen Sie sich den Code in lib/pry_is_awesome.rb

Sie sollten den folgenden Code sehen:

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

Hier benötigen wir pry , was Sie tun müssen, um pry zu verwenden, eine Methode zu definieren und diese Methode dann aufzurufen.

Führen Sie im Verzeichnis dieses Repos in Ihrem Terminal die Datei aus, indem Sie rubylib/pry_is_awesome.rb eingeben. Schauen Sie sich Ihr Terminal an. Du solltest so etwas sehen:

 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)>

Sie haben Ihr Programm während der Ausführung eingefroren und befinden sich jetzt in einem REPL insideyour-Programm. Sie haben im Grunde nur die Zeit gestoppt! Wie cool ist das?

Geben Sie im Terminal in Ihrer Pry-Konsole den Variablennamen inside_the_method ein und drücken Sie die Eingabetaste. Sie sollten einen Rückgabewert von "We're inside the method"

Sie können die Daten in der Methode untersuchen, in der Sie Ihre Bindung platziert haben.

Geben Sie nun im Terminal in Ihrer Pry-Konsole den Variablennamenthis_variable_hasnt_been_interpreted_yet ein. Sie sollten einen Rückgabewert von nil sehen. Das liegt daran, dass die Bindung, die Sie in Zeile 7 platziert haben, das Programm in Zeile 7 tatsächlich eingefroren hat und die gerade aufgerufene Variable noch nicht interpretiert wurde.Folglich weiß unser REPL nichts davon.

Geben Sie nun im Terminal exit ein, und Sie verlassen Ihre Pry-Konsole und das Programm wird weiterhin ausgeführt.

Anleitung Teil II: Pry zum Debuggen verwenden

Sie können nicht nur den Code in Pry untersuchen, sondern auch Variablen manipulieren und Code ausprobieren. Dies ist, wo Pry wirklich hilfreich für das Debuggen wird. Wenn Sie eine Methode haben, die nicht das tut, was sie tun soll, anstatt Änderungen in Ihrem Texteditor vorzunehmen und die Tests immer wieder auszuführen, bis Sie funktionieren, können Sie eine Bindung in Ihren Code einfügen und Dinge ausprobieren. Sobald Sie herausgefunden haben, wie Sie das Problem beheben können, aktualisieren Sie den Code in Ihrem Texteditor entsprechend.

Lassen Sie uns gemeinsam ein Beispiel durchgehen. In diesem Repository, das Sie gegabelt und auf Ihren Computer geklont haben, sehen Sie einen Ordner spec mit einer Dateipry_debugging_spec.rb. Dies ist ein Test für die Datei lib/pry_debugging.rb.

In pry_debugging.rb haben wir eine kaputte Methode. Führen Sie learn test aus, um den fehlgeschlagenen Test anzuzeigen. Sie sollten Folgendes sehen:

 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)>'

Also, was passiert? In der zweiten Zeile (der Zeile, die mitFailure/Error beginnt) können wir sehen, dass der Test die plus_two -Methode aufruft und 3 als Argument übergibt. Darunter können wir sehen, dass der Test erwartet, dass5 zurückgegeben wird, aber stattdessen 3 zurückgegeben wird. Wir erinnern uns, dass thereturn Wert einer Methode in Ruby ist in der Regel der Wert der letzten Zeile dermethode, in diesem Fall num:

def plus_two(num) num + 2 numend

Während unsere Methode in der zweiten Zeile 2 zu num hinzufügt, scheint es, dass num nicht aktualisiert wird. Oben in unsererspec/pry_debugging_spec.rb -Datei ist ein Hebel erforderlich, damit wir dies überprüfen können. Platzieren wir einbinding.pry in unserem Code direkt nach dieser Zeile:

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

Führen Sie nun die Testsuite erneut aus und legen Sie sie in Ihrer Pry-Konsole ab. Ihr terminalsollte so aussehen:

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>)>

Überprüfen wir unseren aktuellen Rückgabewert, indem wir num an der Eingabeaufforderung Pry eingeben. Du solltest so etwas sehen:

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

Indem wir den Wert der Variablen in unserer Pry-Konsole überprüfen, können wir bestätigendass num immer noch gleich 3 ist und die Methode daher 3 zurückgibt.

Wie können wir den Code in Zeile 2 so ändern, dass sich die Methode erwartungsgemäß verhält? Wir müssen den Wert unserer Variablen num so aktualisieren, dass er der Summe von 1 und 2 entspricht. Spielen Sie in Ihrer Pry-Konsole herum: Versuchen Sie, den Code so zu programmieren, dass youthink num nach Bedarf aktualisiert, und überprüfen Sie dann den Wert von num, um festzustellen, ob er funktioniert. Sobald Sie es herausgefunden haben, können Sie exit in Ihr Terminal eingeben, um den Code in Ihrem Texteditor zu aktualisieren und den Test erneut auszuführen, um zu überprüfen, ob er bestanden wurde. Achten Sie darauf, die binding.pry zu entfernen!

Es kann eine Weile dauern, bis Sie den Dreh raus haben, also machen Sie sich keine Sorgen, wenn es noch etwas verwirrend ist. Wenn Sie mit komplexeren Methoden Unddatenstrukturen arbeiten, werden Sie feststellen, dass dies ein sehr hilfreiches Werkzeug sein kann.