Débogage Avec Pry

Aperçu

Nous allons couvrir Pry, un type de REPL, et discuter de la façon de l’installer et de l’utiliser pour déboguer le programme.

Objectifs

  1. Expliquez en quoi Pry est un REPL plus flexible que IRB.
  2. Installez Pry sur votre ordinateur (déjà installé pour les utilisateurs ID).
  3. Déboguer un programme à l’aide de la liaison.faites levier dans le corps de votre fichier.

Qu’est-ce qu’un REPL ?

Vous avez déjà été initié aux REPL en utilisant IRB (Ruby interactif).REPL signifie Lire, Évaluer, Imprimer, Boucle. C’est un environnement de programmation interactif qui prend l’entrée d’un utilisateur, l’évalue et renvoie le résultat à l’utilisateur.

Ruby s’installe avec son propre REPL, qui est IRB, que vous avez déjà utilisé.Chaque fois que vous tapez irb dans votre terminal, vous entrez dans un REPL.

Qu’Est-Ce Que Pry ?

Pry est un autre REPL Ruby avec quelques fonctionnalités supplémentaires. Lorsque vous entrez dans IRB, vous entrez dans un tout nouvel environnement interactif. Tout code que vous souhaitez lire dans IRB, vous devez écrire dans IRB ou copier-coller dans IRB. Pry, en revanche, est comme un REPL que vous pouvez injecter dans votre programme.

Pry est beaucoup plus flexible que IRB. Une fois que vous avez installé la bibliothèque Pry (via le Prygem — nous parcourrons l’installation un peu), vous pouvez utiliser un binding.pry n’importe où dans votre code.

Attendez… Qu’est-ce que la liaison ?

La liaison est une classe ruby intégrée dont les objets peuvent encapsuler le contexte de votre portée actuelle (variables, méthodes, etc.), et les conserver pour une utilisation en dehors de ce contexte.

Appeler binding.pry est essentiellement « indiscret » dans l’orcontext de liaison actuel du code, depuis l’extérieur de votre fichier.

Donc, lorsque vous placez la ligne binding.pry dans votre code, cette ligne sera interprétée au moment de l’exécution (lorsque votre programme est exécuté). Lorsque l’interpréteur atteint cette ligne, votre programme se figera et votre terminal se transformera en un REPL qui existe en plein milieu de votre programme, partout où vous avez ajouté la ligne binding.pry.

Jetons un coup d’œil. Dans ce référentiel, vous verrez un fichier appelé pry_is_awesome.rb.

Instructions Partie I

  1. Fork et clone ce référentiel.

  2. Installez Pry sur votre ordinateur en accédant à votre répertoire personnel (cd ~ dans votre terminal) et exécutez gem install pry. (Vous n’avez pas besoin de le faire si vous travaillez dans l’EDI.)

  3. Regardez le code dans lib/pry_is_awesome.rb

Vous devriez voir le code suivant:

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

Ici, nous exigeons pry, ce que vous devez faire pour utiliser pry, définir une méthode, puis appeler cette méthode.

Dans le répertoire de ce dépôt, dans votre terminal, exécutez le fichier en tapant rubylib/pry_is_awesome.rb. Maintenant, regardez votre terminal. Vous devriez voir quelque chose comme ça:

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

Vous avez gelé votre programme au fur et à mesure de son exécution et vous êtes maintenant dans un REPL insideyour programme. Vous venez d’arrêter le temps! C’est cool, ça ?

Dans le terminal, dans votre console de levier, tapez le nom de la variable inside_the_method et appuyez sur entrée. Vous devriez voir une valeur de retour de "We're inside the method"

Vous pouvez explorer les données dans la méthode dans laquelle vous avez placé votrebinding.

Maintenant, dans le terminal, dans votre console de levier, tapez le nom de la variable this_variable_hasnt_been_interpreted_yet. Vous devriez voir une valeur de retour nil. En effet, la liaison que vous avez placée sur la ligne 7 a en fait gelé le programme sur la ligne 7 et la variable que vous venez d’appeler n’a pas encore été interprétée.Par conséquent, notre REPL ne le sait pas.

Maintenant, dans le terminal, tapez exit, et vous quitterez votre console de levier et le programme continuera à s’exécuter.

Instructions Partie II: Utilisation de Pry pour déboguer

En plus d’explorer le code à l’intérieur de Pry, vous pouvez également manipuler des variables et essayer le code. C’est là que Pry devient vraiment utile pour le débogage. Si vous avez une méthode qui ne fait pas ce qu’elle est censée faire, au lieu de faire des modifications dans votre éditeur de texte et d’exécuter les tests encore et encore jusqu’à ce que vous le fassiez fonctionner, vous pouvez mettre une liaison dans votre code et essayer des choses. Une fois que vous avez compris comment résoudre le problème, vous mettez ensuite à jour le code dans votre éditeur de texte en conséquence.

Parcourons ensemble un exemple. Dans ce référentiel que vous avez forkedand cloné sur votre ordinateur, vous verrez un dossier spec contenant un fichier pry_debugging_spec.rb. Ceci est un test pour le fichier lib/pry_debugging.rb.

Dans pry_debugging.rb, nous avons une méthode cassée. Exécutez learn test pour voir le test d’exécution. Vous devriez voir ce qui suit:

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

Alors que se passe-t-il ? Dans la deuxième ligne (la ligne commençant par Failure/Error), nous pouvons voir que le test appelle la méthode plus_two et passe en 3 comme argument. Ci-dessous, nous pouvons voir que le test s’attend à ce que 5 soit renvoyé, mais que 3 est renvoyé à la place. Nous nous souvenons que la valeur de retournement d’une méthode en Ruby est généralement la valeur de la dernière ligne de la méthode, dans ce cas, num:

def plus_two(num) num + 2 numend

Donc, alors que notre méthode ajoute 2 à num sur la deuxième ligne, il semble qu’elle ne met pas à jour num. Nous avons besoin de levier en haut de notre fichier spec/pry_debugging_spec.rb afin que nous puissions l’utiliser pour le vérifier. Plaçons un binding.pry dans notre code, juste après cette ligne:

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

Maintenant, exécutez à nouveau la suite de tests et déposez-la dans votre console Pry. Votre terminaledevrait ressembler à ceci:

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

Vérifions notre valeur de retour actuelle en tapant num à l’invite de levier. Vous devriez voir quelque chose comme ça:

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

En vérifiant la valeur de la variable à l’intérieur de notre console de levier, nous pouvons confirmer que num est toujours égal à 3 et, par conséquent, la méthode renvoie 3.

Comment modifier le code de la ligne 2 pour que la méthode se comporte comme prévu? Nous devons mettre à jour la valeur de notre variable num afin qu’elle soit égale à la somme d’elle-même et de 2. Jouez dans votre console de levier: essayez le code que youthink mettra à jour num si nécessaire, puis vérifiez la valeur de num pour voir s’il fonctionne. Une fois que vous l’avez compris, vous pouvez taper exit dans votre terminal pour sortir du levier, mettre à jour le code dans votre éditeur de texte et relancer le test pour vérifier qu’il passe. Veillez à retirer le binding.pry!

Cela peut prendre un peu de temps pour comprendre l’utilisation de Pry, alors ne vous inquiétez pas si c’est encore un peu déroutant. Lorsque vous commencez à travailler avec des méthodes plus complexes etdes structures de données, vous constaterez que cela peut être un outil très utile.