Felsökning med Pry

översikt

vi kommer att täcka Pry, en typ av REPL, och diskutera hur man installerar och använder den för att debuga program.

mål

  1. förklara hur Pry är en mer flexibel REPL än IRB.
  2. installera Pry på din dator (redan installerat för IDE-användare).
  3. felsöka ett program med bindning.bänd i kroppen av din fil.

Vad är en REPL?

du har redan introducerats till REPLs genom att använda IRB (Interactive Ruby).REPL står för Read, Evaluate, Print, Loop. Det är en interaktiv programmeringsmiljö som tar en användares inmatning, utvärderar den och returnerar resultatet till användaren.

Ruby installeras med sin egen REPL, som är IRB, som du redan har använt.Varje gång du skriver irb i din terminal går du in i en REPL.

Vad Är Pry?

Pry är en annan Ruby REPL med lite extra funktionalitet. När du går in i IRB går du in i en helt ny interaktiv miljö. Varje kod du vill spela inom IRB, du måste skriva i IRB eller kopiera och klistra in i IRB. Pry, å andra sidan, är som en REPL som du kan injicera i ditt program.

Pry är mycket mer flexibel än IRB. När du har installerat Pry-biblioteket (via Prygem—vi går igenom installationen lite) kan du använda en binding.pryvar som helst i din kod.

vänta… Vad är ’bindande’?

bindning är en inbyggd rubinklass vars objekt kan inkapsla sammanhanget för ditt nuvarande omfång (variabler, metoder etc.), och behålla dem för användning utanför det sammanhanget.

att ringa binding.pry är i huvudsak ’nyfiken’ i den aktuella bindningen eller i samband med koden, utanför din fil.

så när du placerar raden binding.pry i din kod kommer den raden att tolkas vid körning (när ditt program körs). När tolken träffarden linjen fryser ditt program faktiskt och din terminal blir till en REPL som finns mitt i ditt program, var du än har lagt tillbinding.pry – raden.

Låt oss ta en titt. I det här arkivet ser du en fil som heterpry_is_awesome.rb.

instruktioner del I

  1. gaffla och klona detta förråd.

  2. installera Pry på din dator genom att navigera till din hemkatalog (cd ~ inyour terminal) och kör gem install pry. (Du behöver inte göra det omdu arbetar i IDE.)

  3. titta på koden i lib/pry_is_awesome.rb

du bör se följande kod:

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

här kräver vi pry, vilket du måste göra för att använda pry, definiera en metod och sedan ringa den metoden.

i katalogen för denna repo, i din terminal, kör filen genom att skriva rubylib/pry_is_awesome.rb. Titta på din terminal. Du bör se somethinglike detta:

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

du har fryst ditt program när det körs och är nu inne i ett REPL insideyour-program. Du har i princip bara stoppat tiden! Hur coolt är det?

i terminalen, i din pry-konsol, skriv variabelnamnet inside_the_methodoch tryck på enter. Du bör se ett returvärde på "We're inside the method"

du kan utforska data i metoden där du har placerat dinbindning.

Skriv nu variabelnamnetthis_variable_hasnt_been_interpreted_yeti terminalen, i din pry-konsol. Du bör se ett returvärde pånil. Det beror på att bindningen du placerade på rad 7 faktiskt frös programmet på rad 7 och variabeln du just ringde har inte tolkats än.Följaktligen vet vår REPL inte om det.

nu, i terminalen, skriv exit, och du lämnar din pry-konsol och programmet fortsätter att köras.

instruktioner del II: använda Pry för att felsöka

förutom att utforska kod inuti Pry kan du också manipulera variablesand prova kod ut. Det är här Pry verkligen blir till hjälp för felsökning. Om du har en metod som inte gör vad den ska göra, istället för att göra ändringar i din textredigerare och köra testerna om och om igen tills du får det, kan du sätta en bindning i din kod och prova saker. När du har räknat ut hur du åtgärdar problemet uppdaterar du sedan koden i din textredigerare.

Låt oss gå igenom ett exempel tillsammans. I det här arkivet som du har gaffeloch klonat ner på din dator ser du en spec mapp som innehåller en filpry_debugging_spec.rb. Detta är ett test för filen lib/pry_debugging.rb.

i pry_debugging.rb har vi en trasig metod. Kör learn test för att sefel test. Du bör se följande:

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

så vad händer? I den andra raden (raden som börjar medFailure/Error) kan vi se att testet kallar plus_two – metoden ochpasserar i 3 som ett argument. Nedan kan vi se att testet förväntar sig att5 ska returneras, men att 3 returneras istället. Vi kommer ihåg att detåtervända värdet av en metod i Ruby är i allmänhet värdet av den sista raden i metoden, i detta fall num:

def plus_two(num) num + 2 numend

så medan vår metod lägger till 2 till numpå den andra raden verkar det som om det inte uppdateras num. Vi har Pry krävs högst upp i vår spec/pry_debugging_spec.rb fil så att vi kan använda den för att verifiera detta. Låt oss placera enbinding.pry i vår kod, direkt efter den raden:

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

kör nu testpaketet igen och släpp in i din Pry-konsol. Din terminalbör se ut så här:

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

Låt oss kolla vårt nuvarande returvärde genom att skriva num vid Pry-prompten. Dubör se något så här:

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

genom att kontrollera värdet på variabeln inuti vår pry-konsol kan vi bekräftaatt num fortfarande är lika med 3 och som ett resultat returnerar metoden 3.

Hur kan vi ändra koden på rad 2 så att metoden beter sig i förväntat sätt? Vi måste uppdatera värdet på vår num variabel så att den är lika medsumman av sig själv och 2. Spela runt i din Pry-konsol: prova kod som youthink kommer att uppdatera num efter behov, kontrollera sedan värdet på num för att se om det fungerade. När du har räknat ut det kan du skriva exit i din terminal för att komma ut ur Pry, uppdatera koden i din textredigerare och kör om testet för att verifiera att det passerar. Var noga med att ta bort binding.pry!

det kan ta lite tid att få kläm på att använda bända så oroa dig inte om det ’ sstill lite förvirrande. När du börjar arbeta med mer komplexa metoder ochdatastrukturer, hittar du det kan vara ett mycket användbart verktyg.