Debuggen met Pry

overzicht

We behandelen Pry, een type REPL, en bespreken hoe het te installeren en te gebruiken om het programma te debuggen.

doelstellingen

  1. leg uit hoe Pry een flexibeler REPL is dan IRB.
  2. installeer Pry op uw computer (al geïnstalleerd voor IDE-gebruikers).
  3. Debug een programma met behulp van binding.wrikken in het lichaam van uw dossier.

Wat Is een REPL?

u hebt al kennis gemaakt met Repl ‘ s door gebruik te maken van IRB (Interactive Ruby).REPL staat voor Read, Evaluate, Print, Loop. Het is een interactieve programmeeromgeving die de input van een gebruiker neemt, evalueert en het resultaat teruggeeft aan de gebruiker.

Ruby installeert met zijn eigen REPL, dat is IRB, die u al gebruikt.Elke keer dat u irb in uw terminal typt, gaat u een REPL aan.

Wat Is Pry?

Pry is een andere Ruby REPL met een aantal toegevoegde functionaliteit. Wanneer u IRB invoert, betreedt u een gloednieuwe interactieve omgeving. Elke code die je wilt spelen binnen IRB, moet je schrijven in IRB of kopiëren en plakken in IRB. Wrikken, aan de andere kant, is als een REPL die u kunt injecteren in uw programma.

Pry is veel flexibeler dan IRB. Zodra je de Pry bibliotheek installeert (via de Prygem-we gaan zo door de installatie), kun je een binding.pryoveral in je code gebruiken.

wacht… Wat is ‘bindend’?

Binding is een ingebouwde ruby klasse waarvan objecten de context van uw huidige scope (variabelen, methoden etc.), en bewaar ze voor gebruik buiten die context.

binding.pry aanroepen is in wezen ‘nieuwsgierig’ naar de huidige binding of context van de code, van buiten uw bestand.

dus als je de regel binding.pry in je code plaatst, wordt die regel uitgelegd tijdens runtime (als je programma wordt uitgevoerd). Als de interpreter op die regel klikt, zal je programma bevriezen en zal je terminal draaien in een REPL die midden in je programma bestaat, waar je debinding.pry regel ook hebt toegevoegd.

laten we eens kijken. In deze repository ziet u een bestand met de naampry_is_awesome.rb.

instructies deel I

  1. Fork en clone deze repository.

  2. installeer Pry op uw computer door naar uw persoonlijke map (cd ~ in uw terminal) te navigeren en voer gem install pryuit. (Je hoeft dit niet te doen als je werkt in de IDE.)

  3. Kijk naar de code in lib/pry_is_awesome.rb

u zou de volgende code moeten zien:

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 hebben we pry nodig, wat je moet doen om pry te gebruiken, een methode te definiëren en dan die methode aan te roepen.

in de map van deze repo, in uw terminal, voer het bestand uit door rubylib/pry_is_awesome.rbte typen. Kijk naar je terminal. Je zou iets als dit moeten zien.:

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

u hebt uw programma bevroren terwijl het wordt uitgevoerd en bevindt zich nu in een REPL insideyour programma. Je hebt de tijd stilgelegd. Hoe cool is dat?

in de terminal, in uw pry console, typ de variabele naam inside_the_methoden druk op enter. U zou een retourwaarde moeten zien van "We're inside the method"

u kunt de gegevens bekijken binnen de methode waarin u uw binding hebt geplaatst.

nu, in de terminal, in uw pry console, typ de variabele naamthis_variable_hasnt_been_interpreted_yet. U zou een retourwaarde moeten zien vannil. Dat komt omdat de binding die je op lijn 7 plaatste het programma op lijn 7 bevroor en de variabele die je zojuist hebt aangeroepen nog niet is geà nterpreteerd.Onze REPL Weet er dus niets van.

nu, in de terminal, typ exit, en je verlaat je pry console en het programma zal doorgaan met uitvoeren.

instructies Deel II: Pry gebruiken om

te debuggen naast het verkennen van code in Pry, kunt u ook variables manipuleren en code uitproberen. Dit is waar wrikken echt nuttig wordt voor het debuggen. Als je een methode hebt die niet doet wat het hoort te doen, in plaats van wijzigingen aan te brengen in je teksteditor en de tests steeds opnieuw uit te voeren totdat het werkt, kun je een binding in je code zetten en dingen uitproberen. Zodra u ‘ vefigured uit hoe het probleem op te lossen, u vervolgens de code in uw tekstverwerker bijwerken accordingly.

laten we samen een voorbeeld doornemen. In deze repository die u op uw computer hebt afgesplit en gekloond, ziet u een spec map met een bestandpry_debugging_spec.rb. Dit is een test voor het bestand lib/pry_debugging.rb.

in pry_debugging.rb hebben we een gebroken methode. Voer learn test uit om de foutieve test te zien. U zou het volgende moeten zien:

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

dus wat gebeurt er? In de tweede regel (de regel die begint metFailure/Error), kunnen we zien dat de test de plus_two methode aanroept en als argument in 3 passeert. Hieronder kunnen we zien dat de test verwacht dat5 wordt geretourneerd, maar dat 3 in plaats daarvan wordt geretourneerd. We herinneren ons dat de waarde van een methode in robijn in het algemeen de waarde is van de laatste regel van de methode, in dit geval num:

def plus_two(num) num + 2 numend

dus terwijl onze methode 2 toevoegt aan num op de tweede regel, lijkt het erop dat numniet wordt bijgewerkt. We hebben Pry vereist aan de bovenkant van onsspec/pry_debugging_spec.rb bestand zodat we het kunnen gebruiken om dit te verifiëren. Laten we eenbinding.pry in onze code plaatsen, direct na die regel:

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

nu, Voer de test suite opnieuw en drop in uw Pry console. Je terminaal moet er zo uitzien:

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

laten we onze huidige retourwaarde controleren door num achter de Pry prompt te typen. Je zou zoiets als dit moeten zien:

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

door de waarde van de variabele in onze pry console te controleren, kunnen we bevestigen dat num nog steeds gelijk is aan 3 en als gevolg daarvan geeft de methode 3terug.

Hoe kunnen we de code op Regel 2 zo wijzigen dat de methode zich in de expectedway gedraagt? We moeten de waarde van onze num variabele bijwerken zodat deze gelijk is aan de som van zichzelf en 2. Speel rond in je Pry console: probeer code die Youth think num naar behoefte zal bijwerken, controleer dan de waarde van num om te zien of het werkte. Zodra u erachter bent kunt u exit in uw terminal typen om uit de Pry te komen, de code in uw teksteditor bijwerken en de test opnieuw uitvoeren om te controleren of het klopt. Verwijder de binding.pry!

het kan even duren voordat het gebruik van Pry onder de knie is, dus maak je geen zorgen als het nog een beetje verwarrend is. Als je begint te werken met meer complexe methoden endata structuren, zult u merken dat het een zeer nuttig hulpmiddel kan zijn.