Debug con Pry

Panoramica

Tratteremo Pry, un tipo di REPL, e discutere come installarlo e usarlo per debuga programma.

Obiettivi

  1. Spiegare come Pry è un REPL più flessibile di IRB.
  2. Installa Pry sul tuo computer (già installato per gli utenti IDE).
  3. Eseguire il debug di un programma utilizzando l’associazione.fai leva all’interno del corpo del tuo file.

Che cos’è un REPL?

Sei già stato introdotto per REPLs attraverso l’utilizzo di IRB (Interactive Ruby).REPL sta per Read, Evaluate, Print, Loop. È un ambiente di programmazione interattivo che prende l’input di un utente, lo valuta e restituisce il risultato all’utente.

Ruby si installa con il proprio REPL, che è IRB, che hai già utilizzato.Ogni volta che digiti irb nel tuo terminale, stai entrando in un REPL.

Che cos’è la leva?

Pry è un altro REPL rubino con alcune funzionalità aggiunte. Quando entri in IRB, stai entrando in un nuovo ambiente interattivo. Qualsiasi codice che si desidera riprodurre all’interno di IRB, è necessario scrivere in IRB o copiare e incollare in IRB. Pry, d’altra parte, è come un REPL che puoi iniettare nel tuo programma.

Pry è molto più flessibile di IRB. Una volta installata la libreria Pry (tramite Prygem—passeremo attraverso l’installazione in un po’), puoi usare un binding.pryovunque nel tuo codice.

Aspetta… Che cosa è ‘vincolante’?

Binding è una classe ruby incorporata i cui oggetti possono incapsulare il contesto del tuo ambito corrente (variabili, metodi ecc.), e conservarli per l’uso al di fuori di tale contesto.

Chiamare binding.pry è essenzialmente “curiosare” nel binding corrente ocontext del codice, dall’esterno del file.

Quindi quando inserisci la riga binding.pry nel tuo codice, quella riga verrà interpretata in fase di runtime (mentre il tuo programma viene eseguito). Quando l’interprete colpisce quella linea, il tuo programma si bloccherà e il tuo terminale si trasformerà in una replica che esiste proprio nel mezzo del tuo programma, ovunque tu abbia aggiunto la lineabinding.pry.

Diamo un’occhiata. In questo repository, vedrai un file chiamato pry_is_awesome.rb.

Istruzioni Parte I

  1. Fork e clonare questo repository.

  2. Installa Pry sul tuo computer navigando nella directory home (cd ~ nel tuo terminale) ed esegui gem install pry. (Non è necessario farlo se stai lavorando nell’IDE.)

  3. Guarda il codice in lib/pry_is_awesome.rb

Dovresti vedere il seguente codice:

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

Qui stiamo richiedendo pry, che devi fare per usare pry,definire un metodo e quindi chiamare quel metodo.

Nella directory di questo repository, nel tuo terminale, esegui il file digitando rubylib/pry_is_awesome.rb. Ora, guarda il tuo terminale. Dovresti vedere qualcosa del genere:

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

Hai congelato il tuo programma mentre viene eseguito e ora sei all’interno di un programma REPL insideyour. In pratica hai appena fermato il tempo! Quanto e ‘ figo?

Nel terminale, nella console pry, digitare il nome della variabile inside_the_method e premere invio. Dovresti vedere un valore restituito di "We're inside the method"

Sei in grado di esplorare i dati all’interno del metodo in cui hai inserito yourbinding.

Ora, nel terminale, nella console pry, digitare il nome della variabilethis_variable_hasnt_been_interpreted_yet. Dovresti vedere un valore restituito dinil. Questo perché il binding che hai inserito sulla riga 7 ha effettivamente congelato il programma sulla riga 7 e la variabile che hai appena chiamato non è stata ancora interpretata.Di conseguenza, il nostro REPL non lo sa.

Ora, nel terminale, digita exit, e lascerai la tua console pry e theprogram continuerà ad essere eseguito.

Istruzioni Parte II: Usando Pry per eseguire il debug

Oltre a esplorare il codice all’interno di Pry, puoi anche manipolare le variabilie provare il codice. Questo è dove la leva diventa davvero utile per il debug. Se hai un metodo che non sta facendo quello che dovrebbe fare, invece di fare cambiamenti nel tuo editor di testo ed eseguire i test più e più volte fino a quando non funzionerai, puoi mettere un binding nel tuo codice e provare le cose. Una volta che hai scoperto come risolvere il problema, aggiorni il codice nel tuo editor di testo in modo coerente.

Facciamo un esempio insieme. In questo repository che hai biforcato e clonato sul tuo computer, vedrai una cartella spec contenente un filepry_debugging_spec.rb. Questo è un test per il file lib/pry_debugging.rb.

In pry_debugging.rb, abbiamo un metodo rotto. Esegui learn test per vedere il test falling. Dovresti vedere quanto segue:

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

Allora, che succede? Nella seconda riga (la riga che inizia conFailure/Error), possiamo vedere che il test sta chiamando il metodo plus_two epassing in 3 come argomento. Di seguito possiamo vedere che il test si aspetta che5 venga restituito, ma che invece viene restituito 3. Ricordiamo che il valore di ritorno di un metodo in Ruby è generalmente il valore dell’ultima riga del metodo, in questo caso, num:

def plus_two(num) num + 2 numend

Quindi, mentre il nostro metodo sta aggiungendo 2 a num sulla seconda riga, sembra che non stia aggiornando num. Abbiamo Pry richiesto nella parte superiore del nostro filespec/pry_debugging_spec.rb in modo che possiamo usarlo per verificare questo. Mettiamo unbinding.pry nel nostro codice, subito dopo quella riga:

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

Ora, eseguire nuovamente la suite di test e cadere nella console di leva. Il tuo terminale dovrebbe assomigliare a questo:

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

Controlliamo il nostro valore di ritorno corrente digitando num al prompt della leva. Dovresti vedere qualcosa del genere:

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

Controllando il valore della variabile all’interno della nostra console pry, possiamo confermare che num è ancora uguale a 3 e, di conseguenza, il metodo restituisce 3.

Come possiamo modificare il codice sulla riga 2 in modo che il metodo si comporti nel modo previsto? Dobbiamo aggiornare il valore della nostra variabile num in modo che sia uguale alla somma di se stesso e 2. Gioca all’interno della tua console Pry: prova il codice che youthink aggiornerà num secondo necessità, quindi controlla il valore di num per vedere se ha funzionato. Una volta capito, puoi digitare exit nel tuo terminale per uscire dalla leva, aggiornare il codice nel tuo editor di testo e rieseguire il test per verificarlo. Assicurarsi di rimuovere il binding.pry!

Può richiedere un po ‘di tempo per ottenere il blocco di utilizzare Pry quindi non preoccuparti se è ancora un po’ confuso. Quando inizi a lavorare con metodi più complessi estrutture di dati, troverai che può essere uno strumento molto utile.