Depuración Con Pry
Descripción general
Cubriremos Pry, un tipo de REPL, y discutiremos cómo instalarlo y usarlo en el programa debuga.
Objetivos
- Explique cómo Pry es un REPL más flexible que IRB.
- Instale Pry en su computadora (ya está instalada para usuarios de IDE).
- Depurar un programa mediante enlace.busca en el cuerpo de tu expediente.
¿Qué es un REPL?
Ya se le ha introducido a las réplicas mediante el uso de IRB (Ruby Interactivo).REPL significa Leer, Evaluar, Imprimir, Bucle. Es un entorno de programación interactivo que toma la entrada de un usuario, la evalúa y devuelve el resultado al usuario.
Ruby se instala con su propia REPL, que es IRB, que ya has estado usando.Cada vez que escribes irb
en tu terminal, entras en un REPL.
¿Qué Es Pry?
Pry es otro Ruby REPL con algunas funcionalidades añadidas. Cuando entras en IRB, entras en un nuevo entorno interactivo. Cualquier código que desee reproducir dentro de IRB, debe escribirlo en IRB o copiarlo y pegarlo en IRB. Pry, por otro lado, es como un REPL que puedes inyectar en tu programa.
Pry es mucho más flexible que IRB. Una vez que instale la biblioteca de Pry (a través del Prygem, recorreremos la instalación en un poco), puede usar un binding.pry
en cualquier lugar de su código.
Espera… ¿Qué es ‘atar’?
El enlace es una clase ruby integrada cuyos objetos pueden encapsular el contexto de su ámbito actual (variables, métodos, etc.).), y conservarlos para su uso fuera de ese contexto.
Llamar a binding.pry
es esencialmente «entrometerse» en el enlace o contenido actual del código, desde fuera de su archivo.
Así que cuando coloque la línea binding.pry
en su código, esa línea se interpretará en tiempo de ejecución (a medida que se ejecute el programa). Cuando el intérprete toque esa línea, su programa se congelará y su terminal girará en un REPL que existe justo en el medio de su programa, donde quiera que haya agregado la líneabinding.pry
.
Echemos un vistazo. En este repositorio, verá un archivo llamadopry_is_awesome.rb
.
Instrucciones Parte I
-
Bifurca y clona este repositorio.
-
Instale Pry en su computadora navegando a su directorio personal (
cd ~
en su terminal) y ejecutegem install pry
. (No necesita hacer esto si está trabajando en el IDE.) -
Mira el código en
lib/pry_is_awesome.rb
Debería ver el siguiente código:
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
Aquí estamos requiriendo pry
, lo que debe hacer para usar pry, definir un método y luego llamar a ese método.
En el directorio de este repositorio, en su terminal, ejecute el archivo escribiendo rubylib/pry_is_awesome.rb
. Ahora, mira tu terminal. Deberías ver algo como esto.:
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)>
Ha congelado su programa mientras se ejecuta y ahora está dentro de un REPL dentro de su programa. ¡Básicamente detuviste el tiempo! ¿Qué tan genial es eso?
En el terminal, en la consola de palanca, escriba el nombre de variable inside_the_method
y presione entrar. Debería ver un valor devuelto de "We're inside the method"
Puede explorar los datos dentro del método en el que ha colocado su enlace.
Ahora, en el terminal, en la consola de pry, escriba el nombre de variablethis_variable_hasnt_been_interpreted_yet
. Debería ver un valor devuelto denil
. Esto se debe a que el enlace que colocaste en la línea 7 en realidad congeló el programa en la línea 7 y la variable a la que acabas de llamar aún no se ha interpretado.En consecuencia, nuestro REPL no lo sabe.
Ahora, en el terminal, escriba exit
, y saldrá de la consola de pry y el programa continuará ejecutándose.
Instrucciones Parte II: Uso de Pry para depurar
Además de explorar el código dentro de Pry, también puede manipular variables y probar el código. Aquí es donde Pry realmente se vuelve útil para la depuración. Si tienes un método que no está haciendo lo que se supone que debe hacer, en lugar de hacer cambios en tu editor de texto y ejecutar las pruebas una y otra vez hasta que lo hagas funcionar, puedes poner un enlace en tu código y probar cosas. Una vez que haya averiguado cómo solucionar el problema, actualice el código de su editor de texto de forma acorde.
Veamos juntos un ejemplo. En este repositorio que ha bifurcado y clonado en su computadora, verá una carpeta spec
que contiene un archivopry_debugging_spec.rb
. Esta es una prueba para el archivo lib/pry_debugging.rb
.
En pry_debugging.rb
, tenemos un método roto. Ejecute learn test
para ver la prueba de falla. Deberías ver lo siguiente:
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)>'
Entonces, ¿qué está pasando? En la segunda línea (la línea que comienza conFailure/Error
), podemos ver que la prueba llama al método plus_two
y pasa a 3
como argumento. A continuación podemos ver que la prueba espera que se devuelva5
, pero que se devuelve 3
en su lugar. Recordamos que el valor de retorno de un método en Ruby es generalmente el valor de la última línea del método, en este caso, num
:
def plus_two(num) num + 2 numend
Así que mientras nuestro método está agregando 2 a num
en la segunda línea, parece que no está actualizando num
. Tenemos Pry requerido en la parte superior de nuestro archivospec/pry_debugging_spec.rb
para que podamos usarlo para verificar esto. Pongamos un binding.pry
en nuestro código, justo después de esa línea:
def plus_two(num) num + 2 binding.pry numend
Ahora, ejecute el conjunto de pruebas de nuevo y colóquelo en su consola de palanca. Tu terminal debería verse así:
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>)>
Comprobemos nuestro valor de retorno actual escribiendo num
en el indicador de palanca. Deberías ver algo como esto:
pry(#<RSpec::ExampleGroups::PlusTwo>)> num=> 3 pry(#<RSpec::ExampleGroups::PlusTwo>)>
Comprobando el valor de la variable dentro de nuestra consola pry, podemos confirmar que num
sigue siendo igual a 3
y, como resultado, el método devuelve 3
.
¿Cómo podemos modificar el código en la línea 2 para que el método se comporte de la manera esperada? Necesitamos actualizar el valor de nuestra variable num
para que sea igual a la suma de sí misma y 2. Juegue dentro de su consola Pry: pruebe el código que cree que actualizará num
según sea necesario, luego verifique el valor de num
para ver si funcionó. Una vez que lo averigüe, puede escribir exit
en su terminal para salir de la palanca, actualizar el código en su editor de texto y volver a ejecutar la prueba para verificar que está pasando. Asegúrese de quitar el binding.pry
!
Puede tomar un poco de tiempo acostumbrarse a usar Pry, así que no se preocupe si aún es un poco confuso. A medida que comience a trabajar con métodos y estructuras de datos más complejos, encontrará que puede ser una herramienta muy útil.