Além do puts: inspeção de estado ao vivo
O ciclo do puts
Um primeiro movimento típico de debug: espalhar chamadas de puts pelo método e rodar o programa inteiro de novo. Você lê o que foi impresso, decide que não basta, adiciona mais puts e roda outra vez.
def total_price(items)
subtotal = items.sum
puts "subtotal: #{subtotal}"
subtotal * 1.1
end
Essa linha responde uma pergunta, decidida com antecedência: "qual é o subtotal". Quando surge outra pergunta no meio da investigação ("espera, o que tem dentro de items?"), o arquivo precisa de outro puts, e o programa precisa rodar de novo do início.
Um tipo diferente de ferramenta
E se a execução pudesse pausar naquela linha, para você fazer qualquer pergunta de forma interativa sobre os valores que já estão ali? Isso é o binding.irb, colocado direto dentro de um método:
From: .../total_price.rb @ line 5 :
3: def total_price(items)
4: subtotal = items.sum
=> 5: binding.irb
6: subtotal * 1.1
7: end
subtotal
60
Nenhum puts foi escrito para subtotal nesse arquivo. Ele foi perguntado depois, no prompt pausado. É como digitar no bin/rails console, só que esse prompt já começa dentro de um método rodando.
Por que isso importa, na prática
Debug com puts pede que você preveja cada pedaço útil de estado antes de rodar o programa uma única vez. O binding.irb tira essa exigência. Depois da pausa, você digita qualquer expressão válida naquele ponto do código, inclusive as que só surgem depois da primeira resposta. A aula 2 mostra o que é o binding.irb e de onde ele vem.
Pontos-chave
- Debug com
putsexige decidir cada pergunta com antecedência, e depois rodar o programa inteiro de novo para cada pergunta nova. binding.irbpausa a execução naquela linha e abre um prompt ao vivo com o estado real disponível.- Nesse prompt,
subtotalresponde imediatamente, sem nada impresso pra ele com antecedência. - O resto deste curso cobre o que
binding.irbé, o que está disponível nesse prompt, e como retomar a execução depois.
Continue com a aula 2
O que binding.irb realmente é
Explica que binding captura o escopo local e Binding#irb abre uma sessão IRB aninhada, sem precisar de Rails.
Com uma conta grátis você também tem os quizzes, seu progresso e suas anotações, e a discussão.