Feilsøking Med Lirke
Oversikt
vi vil dekke Lirke, EN TYPE REPL, og diskutere hvordan du installerer og bruker den til debuga program.
Mål
- Forklar hvordan Lirke er en mer fleksibel REPL enn IRB.
- Installer Lirke på datamaskinen din (allerede installert FOR IDE-brukere).
- Feilsøke et program ved hjelp av binding.lirke i kroppen av filen.
Hva er EN REPL?
Du har allerede blitt introdusert Til Reps gjennom Å bruke IRB (Interactive Ruby).REPL står For Lese, Evaluere, Print, Loop. Det er et interaktivt programmeringsmiljø som tar brukerens innspill, evaluerer det og returnerer resultatet tilbrukeren.
Ruby installeres med sin EGEN REPL, SOM ER IRB, som du allerede har brukt.Hver gang du skriver irb
inn i terminalen din, går du inn i EN REPL.
Hva Er Lirke?
Lirke er en Annen Ruby REPL med noen ekstra funksjonalitet. NÅR DU skriver INN IRB, går du inn i et helt nytt interaktivt miljø. Enhver kode du vil spille I IRB, må du skrive I IRB eller kopiere OG lime inn I IRB. Lirke, på otherhand, er som EN REPL som du kan injisere i programmet.
Lirke er langt mer fleksibel ENN IRB. Når du har installert Pry-biblioteket—via Prygem-vi går gjennom installasjonen litt), kan du bruke en binding.pry
hvor som helst i koden din.
Vent… Hva er ‘bindende’?
Binding er en innebygd ruby-klasse hvis objekter kan innkapsle konteksten til ditt nåværende omfang (variabler, metoder etc.), og beholde dem for bruk utenfor den konteksten.
Calling binding.pry
er i hovedsak ‘nysgjerrige’ i gjeldende binding orcontext av koden, fra utenfor filen.
Så når du plasserer linjen binding.pry
i koden din, blir den linjen tolket under kjøring (når programmet ditt utføres). Når tolken trefferden linjen, vil programmet faktisk fryse og terminalen din blir tilen REPL som eksisterer midt i programmet ditt, uansett hvor du la tilbinding.pry
– linjen.
La oss ta en titt. I dette depotet ser du en fil som heterpry_is_awesome.rb
.
Instruksjoner Del I
-
Gaffel og klone dette depotet.
-
Installer Lirke på datamaskinen ved å navigere til hjemmekatalogen (
cd ~
inyour terminal) og kjørgem install pry
. (Du trenger ikke å gjøre dette hvis du jobber I IDE.) -
Se på koden i
lib/pry_is_awesome.rb
Du bør 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 krever vi pry
, som du må gjøre for å bruke lirke, definere en metode, og deretter kalle den metoden.
i katalogen til denne repoen, i terminalen din, kjør filen ved å skrive rubylib/pry_is_awesome.rb
. Se på terminalen din. Du bør se noesom 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 programmet som det utfører og er nå inne I EN REPL insideyour program. Du i utgangspunktet bare stoppet tid! Hvor kult er det?
skriv inn variabelnavnet inside_the_method
i terminalen i lirke-konsollen og trykk enter. Du bør se en returverdi på "We're inside the method"
Du kan utforske dataene i metoden der du har plassert dinbinding.
skriv inn variabelnavnetthis_variable_hasnt_been_interpreted_yet
i terminalen, i pry-konsollen. Du bør se en returverdi pånil
. Det er fordi bindingen du plasserte på linje 7 faktisk frøs programmet på linje 7, og variabelen du nettopp ringte, har ikke blitt tolket ennå.Følgelig vet IKKE VÅR REPL om det.
nå, i terminalen, skriv exit
, og du vil forlate din lirke konsoll og programmet vil fortsette å utføre.
Instruksjoner Del II: Bruk Lirke Til Å Feilsøke
i tillegg til å utforske kode inne Lirke, kan du også manipulere variablesand prøve kode ut. Dette er hvor Lirke virkelig blir nyttig for debugging. Hvis du har en metode som ikke gjør hva den skal gjøre, i stedet for å gjøre endringer i tekstredigereren din og kjøre testene igjen og igjen til du får det til å fungere, kan du sette en binding i koden din og prøve ut ting. Når du har funnet ut hvordan du løser problemet, oppdaterer du koden i tekstredigereren din.
La oss gå gjennom et eksempel sammen. I dette depotet som du har forkedand klonet ned på datamaskinen din, vil du se en spec
mappe som inneholder en filpry_debugging_spec.rb
. Dette er en test for filen lib/pry_debugging.rb
.
i pry_debugging.rb
har vi en ødelagt metode. Kjør learn test
for å se thefailing 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å hva skjer? I den andre linjen (linjen som begynner medFailure/Error
), kan vi se at testen kaller plus_two
– metoden ogpasserer i 3
som et argument. Nedenfor kan vi se at testen forventer5
å bli returnert, men at 3
blir returnert i stedet. Vi husker atreturverdien av en metode I Ruby er vanligvis verdien av den siste linjen avmetode, i dette tilfellet num
:
def plus_two(num) num + 2 numend
så mens metoden vår legger til 2 til num
på den andre linjen, ser det ut til at den ikke oppdaterer num
. Vi Har Lirke kreves på toppen av vår spec/pry_debugging_spec.rb
fil slik at vi kan bruke den til å bekrefte dette. La oss plassere enbinding.pry
i koden vår, rett etter den linjen:
def plus_two(num) num + 2 binding.pry numend
nå, kjøre test suite igjen og slippe inn I Lirke konsollen. Din terminalskal se slik ut:
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>)>
La oss sjekke vår nåværende returverdi ved å skrive num
på Lirke prompt. Du burde se noe slikt:
pry(#<RSpec::ExampleGroups::PlusTwo>)> num=> 3 pry(#<RSpec::ExampleGroups::PlusTwo>)>
ved å sjekke verdien av variabelen i vår pry-konsoll, kan vi bekrefteat num
fortsatt er lik 3
, og som et resultat returnerer metoden 3
.
Hvordan kan vi endre koden på linje 2 slik at metoden oppfører seg i expectedway? Vi må oppdatere verdien av vår num
variabel slik at den er lik summen av seg selv og 2. Spill rundt inne I Lirke konsollen: prøv kode som youthink vil oppdatere num
etter behov, så sjekk verdien av num
for å se om itworked. Når du har funnet ut det, kan du skrive exit
i terminalen din for å komme deg ut av Lirke, oppdatere koden i tekstredigereren din, og kjør testen for å bekrefte den. Pass på å fjerne binding.pry
!
Det kan ta litt tid å få taket på å bruke Lirke så ikke bekymre deg hvis det er fortsatt litt forvirrende. Når du begynner å jobbe med mer komplekse metoder ogdatastrukturer, finner du det kan være et svært nyttig verktøy.