Debugging med Pry
oversigt
vi dækker Pry, en type REPL, og diskuterer, hvordan du installerer og bruger det til at debuga program.
mål
- Forklar, hvordan Pry er en mere fleksibel REPL end IRB.
- installer Pry på din computer (allerede installeret til IDE-brugere).
- Debug et program ved hjælp af binding.lirke i kroppen af din fil.
Hvad er en REPL?
du er allerede blevet introduceret til Repl ‘ er ved at bruge IRB (Interactive Ruby).REPL står for læse, evaluere, udskrive, Loop. Det er et interaktivt programmeringsmiljø, der tager en brugers input, evaluerer det og returnerer resultatet til brugeren.
Ruby installerer med sin egen REPL, som er IRB, som du allerede har brugt.Hver gang du skriver irb
i din terminal, indgår du en REPL.
Hvad Er Pry?
Pry er en anden Ruby REPL med nogle ekstra funktionalitet. Når du indtaster IRB, du indtaster et helt nyt interaktivt miljø. Enhver kode, du vil spille inden for IRB, skal du skrive i IRB eller kopiere og indsætte i IRB. Pry, på den anden side, er som en REPL, som du kan injicere i dit program.
Pry er langt mere fleksibel end IRB. Når du har installeret Pry-biblioteket (via Prygem—vi går igennem installationen lidt), kan du bruge en binding.pry
hvor som helst i din kode.
vent… Hvad er ‘bindende’?
Binding er en indbygget rubinklasse, hvis objekter kan indkapsle konteksten af dit nuværende omfang (variabler, metoder osv.), og bevare dem til brug uden for denne sammenhæng.
opkald binding.pry
er i det væsentlige ‘nysgerrig’ i den aktuelle binding ellerkontekst af koden, uden for din fil.
så når du placerer linjen binding.pry
i din kode, vil den linje blive fortolket ved runtime (som dit program udføres). Når tolken rammer den linje, fryser dit program faktisk, og din terminal bliver til en REPL, der findes lige midt i dit program, uanset hvor du tilføjede linjenbinding.pry
.
lad os tage et kig. I dette arkiv vil du se en fil kaldetpry_is_awesome.rb
.
instruktioner del i
-
gaffel og klone dette arkiv.
-
installer Pry på din computer ved at navigere til din hjemmekatalog (
cd ~
inyour terminal) og udførgem install pry
. (Du behøver ikke at gøre dette, hvisdu arbejder i IDE.) -
kig på koden i
lib/pry_is_awesome.rb
du skal se følgende kode:
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
her kræver vi pry
, som du skal gøre for at bruge pry, definere en metode og derefter kalde den metode.
i mappen til denne repo, i din terminal, kør filen ved at skrive rubylib/pry_is_awesome.rb
. Se på din terminal. Du skal se noget som dette:
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 frosset dit program, som det udfører, og er nu inde i en REPL insideyour program. Du stoppede dybest set bare tiden! Hvor sejt er det?
skriv variabelnavnet inside_the_method
i terminalen i din pry-konsol, og tryk på enter. Du skal se en returværdi på "We're inside the method"
du er i stand til at udforske dataene inde i den metode, hvor du har placeret din binding.
skriv nu variabelnavnet this_variable_hasnt_been_interpreted_yet
i terminalen i din pry-konsol. Du skal se en returværdi pånil
. Det skyldes, at bindingen, du placerede på linje 7, faktisk frøs programmet på linje 7, og den variabel, du lige har kaldt, er ikke blevet fortolket endnu.Derfor ved vores REPL ikke om det.
skriv nu i terminalen exit
, så forlader du din pry-konsol, og programmet fortsætter med at udføre.
instruktioner Del II: brug af Pry til fejlfinding
ud over at udforske kode inde i Pry kan du også manipulere variablerog prøv kode ud. Det er her Pry virkelig bliver nyttigt for debugging. Hvis du har en metode, der ikke gør, hvad den skal gøre, i stedet for at foretage ændringer i din teksteditor og køre testene igen og igen, indtil du får det til at fungere, kan du sætte en binding i din kode og prøve tingene. Når du først har fundet ud af, hvordan du løser problemet, skal du derefter opdatere koden i din tekstredaktørefterfølgende.
lad os gå gennem et eksempel sammen. I dette arkiv, som du har forkedand klonet ned på din computer, vil du se en spec
mappe, der indeholder en filpry_debugging_spec.rb
. Dette er en test for filen lib/pry_debugging.rb
.
i pry_debugging.rb
har vi en brudt metode. Kør learn test
for at sefailing test. Du bør se følgende:
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å hvad sker der? I den anden linje (linjen starter medFailure/Error
) kan vi se, at testen kalder plus_two
metoden ogpasserer i 3
som et argument. Nedenfor kan vi se, at testen forventer, at5
returneres, men at 3
returneres i stedet. Vi husker detreturn værdi af en metode i rubin er generelt værdien af den sidste linje afmetode, i dette tilfælde num
:
def plus_two(num) num + 2 numend
så mens vores metode tilføjer 2 til num
på anden linje, ser det ud til, at det ikke opdaterer num
. Vi har Pry krævet øverst i voresspec/pry_debugging_spec.rb
fil, så vi kan bruge den til at bekræfte dette. Lad os placere enbinding.pry
i vores kode lige efter den linje:
def plus_two(num) num + 2 binding.pry numend
Kør nu testsuiten igen og slip ind i din Lirkekonsol. Din terminalskal se sådan ud:
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>)>
lad os kontrollere vores aktuelle returværdi ved at skrive num
ved Lirkeprompten. Duskal se noget som dette:
pry(#<RSpec::ExampleGroups::PlusTwo>)> num=> 3 pry(#<RSpec::ExampleGroups::PlusTwo>)>
ved at kontrollere værdien af variablen inde i vores pry-konsol kan vi bekræfteat num
stadig er lig med 3
og som et resultat vender metoden tilbage 3
.
Hvordan kan vi ændre koden på linje 2, så metoden opfører sig i den forventedemåde? Vi skal opdatere værdien af vores num
variabel, så den er lig medsummen af sig selv og 2. Spil rundt inde i din Pry-konsol: prøv kode, som youthink vil opdatere num
efter behov, og kontroller derefter værdien af num
for at se, om denarbejdede. Når du har fundet ud af det, kan du skrive exit
i din terminal for at komme ud af Pry, opdatere koden i din teksteditor og køre testen igen for at bekræfte, at den passerer. Sørg for at fjerne binding.pry
!
det kan tage lidt tid at få fat i at bruge Pry, så rolig, hvis det stadig er lidt forvirrende. Når du begynder at arbejde med mere komplekse metoder ogdatastrukturer, finder du det kan være et meget nyttigt værktøj.