Um dos problemas com tutorais na web é que muitos são apenas copias traduzidas do manual sem nenhuma explicação pessoal do plagiador.
Se quem le não entendeu o exemplo, boa sorte na jornada, por isso resolvi explicar com mais detalhes o funcionamento do desvio throw / catch, eu mesmo demorei para entender o porque do throw estar localizado em alguns exemplos dentro do catch, agora explicando melhor:
A idéia de um throw aninhado dentro de um catch funciona assim:
Execute o bloco de código abaixo até encontrar um throw, ao encontra-lo pare de executar o bloco de código e continue executando o que estiver na sequência.
O que dificulta o entendimento inicial de de throw / catch é que a tradução desses dois comandos equivale a "Jogue" / "Pegue" o que da a impressão de que o controle do código será transferido para o bloco catch quando o que realmente acontece é "um Jogue para fora de" / "Isto aqui" fazendo com que o controle saia do bloco catch.
# encoding:UTF-8 y = 0 catch(:prematuro) do while y < 10 puts y += 1 throw :prematuro if y == 5 end puts "Essa linha não será executada" end puts "O 'throw:prematuro' fez com que o bloco iniciado por catch fosse finalizado"Equivale exatamente a:
y = 0 while y < 10 puts y += 1 y = 10 if y == 5 endthrow / catch podem ser utilizados entre métodos diferentes, neste caso quando o throw for acionado ele voltará recursivamente até encontrar o catch, imagine que você está em uma trilha e para continuar você deve entrar em uma caverna para chegar do outro lado da trilha, então você vai descendo cada vez mais, passando por níveis mais profundos, ao acionar o throw você seria automaticamente teleportado para o lado de fora da caverna, como se ja a tivesse atravessado, mesmo que restassem mais níveis.
# encoding:UTF-8 def level_1 puts "Entrando no level 1" catch(:caverna) do level_2 end puts "throw! niveis 1-4! Saindo da caverna sem atingir o level 5" end def level_2 puts "Entrando no level 2" level_3 end def level_3 puts "Entrando no level 3" level_4 end def level_4 puts "Entrando no level 4" throw :caverna level_5 end def level_5 puts "Este level não será atingido" end level_1Produz:
Entrando no level 1 Entrando no level 2 Entrando no level 3 Entrando no level 4 throw! niveis 1-4! Saindo da caverna sem atingir o level 5Este post foi escrito ao som de [OST] Ace Combat Zero - Zero
0 comentários :
Postar um comentário