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_1
Produz:
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