Debugging With Pry
Overview
we’ll cover Pry, a type of REPL, and discuss how to install and use it to debuga program.
objectivos
- explicar como a Pry é um REPL mais flexível do que a IRB.
- instale a Pry no seu computador (já instalada para utilizadores do IDE).
- depurar um programa usando a ligação.bisbilhotar dentro do corpo do teu ficheiro.
o que é um REPL?
você já foi introduzido a REPLs através do uso de IRB (Ruby interativa).REPL significa ler, avaliar, imprimir, Loop. Ele é um interativo programmingenvironment que leva a entrada do usuário, avalia e retorna o resultado para o usuário.
Ruby instalado com seu próprio REPL, que é IRB, que você já vem usando.Toda vez que você digitar irb
no seu terminal, você está entrando em um REPL.
O Que É Erguer?
Levante é outra Ruby REPL com algumas funcionalidades adicionais. Quando você entrar IRB, você esteja entrando em um novo ambiente interativo. Qualquer código que você quer jogar dentro do IRB, você precisa escrever no IRB ou copiar e colar no IRB. Pry, por outro lado, é como um REPL que você pode injetar em seu programa.
Pry é muito mais flexível do que IRB. Uma vez que você instale a Biblioteca Pry (através do Prygem—vamos caminhar através da instalação em um pouco), você pode usar um binding.pry
em qualquer lugar do seu código.
espere… O que é “vinculativo”?
Binding é uma classe de ruby incorporada cujos objectos podem encapsular o contexto do seu âmbito actual (variáveis, métodos, etc.) e conservá-las para utilização fora deste contexto.
chamar binding.pry
é essencialmente ‘bisbilhotar’ na ligação ou no contexto actual do código, de fora do seu ficheiro.
assim, quando colocar a linha binding.pry
no seu código, essa linha será interpretada em tempo de execução (à medida que o seu programa for executado). Quando o interpretador atingir essa linha, o seu programa irá realmente congelar e o seu terminal irá transformar o REPL intoa que existe mesmo no meio do seu programa, onde quer que tenha adicionado a linhabinding.pry
.Vamos dar uma olhada. Neste repositório, você verá um arquivo chamado pry_is_awesome.rb
.
instruções Parte I
-
garfo e clone este repositório.
-
Instale o Pry no seu computador navegando para a sua pasta pessoal (
cd ~
no seu terminal) e executegem install pry
. (Você não precisa fazer isso se você está trabalhando na IDE.) -
observar o código
lib/pry_is_awesome.rb
Você deve ver o seguinte 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
Aqui estamos exigindo que pry
, o que você deve fazer para usar levante, a definição de um método,e, em seguida, chamar o método.
no directório deste acordo, no seu terminal, execute o ficheiro escrevendo rubylib/pry_is_awesome.rb
. Agora, olha para o teu terminal. Devias ver algo assim.:
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)>
você congelou o seu programa enquanto ele executa e agora está dentro de um REPL insideyo seu programa. Basicamente parou o tempo! Não é fixe?
no terminal, no seu console pry, digite o nome da variável inside_the_method
e carregue em enter. Você deve ver um valor de retorno de "We're inside the method"
você é capaz de explorar os dados dentro do método no qual você colocou sua encadernação.
agora, no terminal, no seu console pry, digite o nome variávelthis_variable_hasnt_been_interpreted_yet
. Você deve ver um valor de retorno denil
. Isso é porque a ligação que você colocou na linha 7 realmente congelou o programa na linha 7 e a variável que você acabou de ligar ainda não foi interpretada.Consequentemente, o nosso REPL não sabe.
agora, no terminal, digite exit
, e você deixará o seu console pry e o programa continuará a ser executado.
instruções Parte II: usando o Pry para depurar
para além de explorar o código dentro do Pry, também pode manipular variáveis e tentar o código. É aqui que o Pry realmente se torna útil para depuração. Se você tem um método que não está fazendo o que é suposto fazer, em vez de fazer mudanças no seu editor de texto e executar os testes vezes sem conta até que você começar a trabalhar, você pode colocar uma ligação em seu código e experimentar as coisas. Uma vez que você tenha certeza de como corrigir o problema, você então atualiza o código em seu editor de texto de forma coordenada.Vamos dar um exemplo juntos. Neste repositório que você procurou e clonou para o seu computador, você verá uma pasta spec
contendo um arquivopry_debugging_spec.rb
. Este é um teste para o arquivo lib/pry_debugging.rb
.
em pry_debugging.rb
, temos um método quebrado. Execute learn test
para ver o teste final. Você deve ver o seguinte:
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)>'
então, o que se passa? Na segunda linha (a linha começando com Failure/Error
), podemos ver que o teste está chamando o método plus_two
e a passagem em 3
como um argumento. Abaixo disso podemos ver que o teste está esperando que5
seja devolvido, mas que 3
está sendo devolvido em vez disso. Lembramos que o valor thereturn de um método em Ruby é geralmente o valor da última linha de themethod, neste caso, num
:
def plus_two(num) num + 2 numend
assim, enquanto o nosso método está a adicionar 2 a num
na segunda linha, parece que não está a actualizar num
. Temos a Pry necessária no topo do nosso arquivospec/pry_debugging_spec.rb
para que possamos usá-lo para verificar isso. Vamos colocar umbinding.pry
no nosso código, logo a seguir àquela linha.:
def plus_two(num) num + 2 binding.pry numend
agora, volte a executar a suíte de teste e caia na sua consola de bisbilhotice. O teu final deve ser assim.:
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>)>
vamos verificar o nosso valor de retorno atual digitando num
no prompt Pry. Devias ver algo assim.:
pry(#<RSpec::ExampleGroups::PlusTwo>)> num=> 3 pry(#<RSpec::ExampleGroups::PlusTwo>)>
verificando o valor da variável dentro do nosso levante console, podemos confirmthat num
é igual a 3
e, como resultado, o método está retornando 3
.
como podemos modificar o código na linha 2 para que o método se comporte da forma esperada? Precisamos atualizar o valor da nossa variável num
para que seja igual à soma de si mesma e 2. Jogue dentro de sua consola de Pry: tente o código que o youthink irá atualizar num
conforme necessário, em seguida, verifique o valor de num
para ver se funcionou. Assim que descobrir, poderá escrever exit
no seu terminal para sair da Pry, actualizar o código no seu editor de texto e repetir o teste para verificar a sua emissão. Certifique-se de remover o binding.pry
!
pode demorar um pouco a apanhar o jeito de usar O Pry, por isso não se preocupe se ainda for um pouco confuso. À medida que você começa a trabalhar com métodos mais complexos e estruturas de dados, você vai achar que pode ser uma ferramenta muito útil.