Debugging cu Pry

Prezentare generală

vom acoperi Pry, un tip de REPL, și a discuta despre cum să instalați și să-l utilizați pentru programul debuga.

obiective

  1. explicați modul în care Pry este un REPL mai flexibil decât IRB.
  2. instalați Pry pe computer (deja instalat pentru utilizatorii IDE).
  3. depanați un program folosind legarea.trageți în corpul dosarului.

ce este un REPL?

ați fost deja introdus la REPLs prin utilizarea IRB (Interactive Ruby).REPL înseamnă citire, evaluare, imprimare, buclă. Este un mediu interactiv de programare care preia intrarea unui utilizator, îl evaluează și returnează rezultatul utilizatorului.

Ruby instalează cu propriul REPL, care este IRB, pe care le-ați folosit deja.De fiecare dată când tastați irb în terminalul dvs., intrați într-un REPL.

Ce Este Pry?

trageți este un alt Ruby REPL cu unele funcționalități adăugate. Când intri în IRB, tuintrați într-un mediu interactiv nou. Orice cod pe care doriți să îl jucați în IRB, trebuie să scrieți în IRB sau să copiați și să lipiți în IRB. Trageți, pe de altă partemână, este ca un REPL pe care îl puteți injecta în programul dvs.

Pry este mult mai flexibil decât IRB. După ce instalați biblioteca Pry (prin Prygem—vom trece prin instalare într-un pic), puteți utiliza un binding.pryoriunde în codul dvs.

așteaptă… Ce este ‘obligatoriu’?

Legarea este o clasă ruby încorporată ale cărei obiecte pot încapsula contextul domeniului dvs. actual (variabile, metode etc.), și să le păstreze pentru a fi utilizate în afara acestui context.

apelare binding.pry este, în esență, ‘indiscreti’ în orcontext curent de legare a codului, din afara fișierului.

deci, atunci când plasați linia binding.pry în codul dvs., acea linie va fi interpretată în timpul rulării (pe măsură ce programul dvs. este executat). Când interpretul lovește acea linie, programul dvs. va îngheța de fapt și terminalul dvs. se va transforma într-un REPL care există chiar în mijlocul programului dvs., oriunde ați adăugat liniabinding.pry.

să aruncăm o privire. În acest depozit, veți vedea un fișier numitpry_is_awesome.rb.

instrucțiuni Partea I

  1. furcă și clonează acest depozit.

  2. instalați Pry pe computer navigând la directorul de acasă (cd ~ inyour terminal) și executați gem install pry. (Nu trebuie să faceți acest lucru dacă lucrați în IDE.)

  3. Uită-te la codul din lib/pry_is_awesome.rb

ar trebui să vedeți următorul cod:

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

aici avem nevoie de pry, ceea ce trebuie să faceți pentru a utiliza trageți, definind o metodă și apoi apelând acea metodă.

în directorul acestui repo, în terminalul dvs., rulați fișierul tastând rubylib/pry_is_awesome.rb. Uită-te la terminalul tău. Ar trebui să vezi ceva ca asta:

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

ați înghețat programul dvs. pe măsură ce se execută și acum vă aflați într-un program REPL insideyour. Practic ai oprit timpul! Cât de tare e asta?

în terminal, în consola pry, tastați numele variabilei inside_the_method și apăsați enter. Ar trebui să vedeți o valoare returnată de "We're inside the method"

puteți explora datele din interiorul metodei în care ați plasat legarea.

acum, în terminal, în consola dvs. Ar trebui să vedeți o valoare returnată denil. Asta pentru că legarea pe care ați plasat-o pe linia 7 a înghețat de fapt programul de pe linia 7 și variabila pe care tocmai ați apelat-o nu a fost încă interpretată.În consecință, REPL noastră nu știe despre asta.

acum, în terminal, tastați exit și veți părăsi consola de prindere și programul va continua să execute.

instrucțiuni Partea II: utilizarea Pry pentru a depana

în plus față de explorarea cod în interiorul Pry, puteți manipula, de asemenea, variablesand încercați Cod afară. Acest lucru este în cazul în care trageți într-adevăr devine util pentru depanare. Dacă aveți o metodă care nu face ceea ce ar trebui să facă, în loc să faceți modificări în editorul de text și să rulați testele de mai multe ori până când o faceți, puteți pune o legare în codul dvs. și puteți încerca lucrurile. Odată ce v-ați dat seama cum să remediați problema, apoi actualizați codul în editorul de textîn consecință.

să parcurgem împreună un exemplu. În acest depozit pe care l-ați forked și clonat pe computer, veți vedea un folder spec care conține un fișierpry_debugging_spec.rb. Acesta este un test pentru fișierul lib/pry_debugging.rb.

în pry_debugging.rb, avem o metodă ruptă. Rulați learn test pentru a vedeatest de eșec. Ar trebui să vedeți următoarele:

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

deci, ce se întâmplă? În a doua linie (linia care începe cuFailure/Error), putem vedea că testul apelează metoda plus_two șitrecerea în 3 ca argument. Mai jos putem vedea că testul se așteaptă ca5 să fie returnat, dar că 3 este returnat în schimb. Ne amintim că valoarea de întoarcere a unei metode în Ruby este, în general, valoarea ultimei linii a metodei, în acest caz, num:

def plus_two(num) num + 2 numend

deci, în timp ce metoda noastră este adăugarea 2 la numpe a doua linie, se pare că itis nu actualizarea num. Avem Pry necesar în partea de sus a fișierului nostruspec/pry_debugging_spec.rb, astfel încât să îl putem folosi pentru a verifica acest lucru. Să plasăm unbinding.pry în codul nostru, imediat după acea linie:

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

acum, executați din nou suita de testare și picătură în consola ta Pry. Terminalul dvs. ar trebui să arate astfel:

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

să verificăm valoarea curentă de returnare tastând num la promptul Pry. Ar trebui să vezi așa ceva:

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

verificând valoarea variabilei din consola noastră, putem confirmacă num este încă egal cu 3și, ca rezultat, metoda returnează 3.

cum putem modifica codul de pe linia 2, astfel încât metoda se comportă în expectedway? Trebuie să actualizăm valoarea variabilei noastre num, astfel încât să fie egală cu suma de sine și 2. Încercați codul pe care youthink îl va actualiza num după cum este necesar, apoi verificați valoarea num pentru a vedea dacă a funcționat. Odată ce vă dați seama, puteți tasta exit în terminalul dvs. pentru a ieși din Trageți, actualizați codul în editorul de text și rulați din nou testul pentru a verifica it ‘ passing. Asigurați-vă că pentru a elimina binding.pry!

poate dura ceva timp pentru a obține atarna de a folosi trageți așa că nu vă faceți griji dacă it ‘ ssthill un pic confuz. Pe măsură ce începeți să lucrați cu metode mai complexe șistructuri de date, veți găsi că poate fi un instrument foarte util.