O Interactive Ruby Shell (IRB) é um REPL (Read-Eval-Print-Loop) usado no dia a dia por muitos Rubistas para testar trechos de código. Mas ele é bastante "limitado", principalmente em versões anteriores à versão 2.7.x do Ruby, onde várias funções não funcionam tão bem como deveriam, como é o caso do uso de múltiplas linhas.
O Pry então surgiu como uma alternativa muito mais poderosa que o IRB. Algumas das suas principais vantagens:
- Syntax highlighting
- Autocomplete
- Inspecção e navegação de objetos
- Editar code em tempo real para rodar novamente
- Debug
Instalação
Vamos começar instalando o Pry e o Pry doc para termos acesso ao Pry e a parte de documentação.
$ gem install pry pry-doc
Podemos começar a utilizar as funções do Pry digitando pry
no terminal:
$ pry
Se você usa Rails, pode utilizar a gem pry-rails que usa Pry ao abrir o
rails console
.
Navegação
Vamos testar alguns comandos de inspecção e navegação, como o cd
e o ls
:
pry (main):0 > array = [1, 2, 3, 4, 5]
# => [1, 2, 3, 4, 5]
pry (main):0 > cd array
pry ([1, 2, 3, 4, 5]):1 > self
# => [1, 2, 3, 4, 5]
Como você pode ver, agora estamos dentro da variável array
que criamos anteriormente. Ao utilizar o comando ls
você lista todos os métodos de um objeto ou classe.
Vale lembrar que se quiser saber mais sobre o comando você pode pedir auxílio da doc com
ls -h
pry ([1, 2, 3, 4, 5]):1 > ls
# Enumerable#methods:
# chain
# chunk_while
# detect
# each_entry
# each_with_index
# entries
# find_all
# grep
# group_by
# lazy
# member?
# minmax
# partition
# slice_after
# slice_when
# to_set
# chunk
# collect_concat
# each_con
# (...)
Como estamos dentro do objeto, nós podemos também chamar métodos diretamente.
pry ([1, 2, 3, 4, 5]):1 > sum
# => 15
Para "sair" do objeto podemos usar o comando cd ..
ou exit
.
pry ([1, 2, 3, 4, 5]):1 > cd ..
pry (main):0 >
Documentação
Uma das minhas funcionalidades preferidas do Pry é o acesso rápido à documentação usando o comando show-doc
pry (main):0 > show-doc Array#map
# From: array.c (C Method):
# Owner: Array
# Visibility: public
# Signature: map()
# Number of lines: 12
# Invokes the given block once for each element of self.
# Creates a new array containing the values returned by the block.
# See also Enumerable#collect.
# If no block is given, an Enumerator is returned instead.
# a = [ "a", "b", "c", "d" ]
# a.collect {|x| x + "!"} #=> ["a!", "b!", "c!", "d!"]
# a.map.with_index {|x, i| x * i} #=> ["", "b", "cc", "ddd"]
# a #=> ["a", "b", "c", "d"]
Debugging
O Pry também é muito conhecido pelas ferramentas de debug. Você pode requerer o pry no seu código com require 'pry'
e a qualquer momento do codigo colocar a linha binding.pry
.
require 'pry'
def meu_metodo
array = [1, 2, 3, 4, 5]
binding.pry
end
meu_metodo
Ao rodar esse arquivo no momento da linha do binding.pry
, seu código irá parar e você poderá interagir com o código como se estivesse naquela linha.
Uma outra gem bastante famosa que enriquece essa capacidade é a pry-byebug,que usa as capacidades do Pry em conjunto com muitas funcionalidades úteis de debug da gem Byebug.
Assim, na etapa de debug, você pode usar comandos como:
step
- para entrar na execução da próxima linha ou método.next
- roda a próxima linha no mesmo frame.finish
- executa a stack atual.continue
- continua a execução.
Isso torna bem mais fácil continuar rodando o código, terminar a execução e ir para a próxima linha. Outros comandos, como up
, down
, frame
, backtrace
, também podem ser utilizados.
Conclusão
O Pry possui outras funcionalidades muito úteis além das apresentadas neste artigo. Se você quiser se aprofundar nesse assunto, indicamos os materiais a seguir para consultar:
- Na wiki do Pry você pode conferir diversos guias, screencasts e palestras.
- Uma outra boa referência é a palestra do Philippe Hardardt no canal do Guru SP talks onde ele faz um debug em tempo real de uma representação do jogo da vida de Conway em Ruby.