Três palavrinhas que podem facilitar bastante a vida quando estamos trabalhando com laços, e que muita gente desconhece.
Imagine que você tenha o seguinte laço:
1 2 3 4 5 6 | var myArray:Array = new Array("one", "two", "three", "four", "five"); for each (var word:String in myArray) { trace(word); } |
Um laço comum e bem simples. O resultado da execução dele é o seguinte:
one
two
three
four
five
break
Imagine que por uma determinada razão, necessitamos interromper a execução do loop quando ele chegar no item four, poe exemplo. Muita gente utiliza a palavra-chave return, mas aí existe um problema bem grande. A palavra return interrompe o execução de um método e retorna um valor, se utilizarmos ela para interromper a execução de um laço, não só estaremos interrompendo a execução do mesmo, como de todas as instruções que virão após ele.
1 2 3 4 5 6 7 8 | var myArray:Array = new Array("one", "two", "three", "four", "five"); for each (var word:String in myArray) { if (word == "four") break; trace(word); } |
O resultado, como você pode ver, é a interrupção da execução do laço no item four e a não execução de qualquer item posterior.
one
two
three
Um caso comum de uso do break é em um switch. Veja só:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | var page:String = "Products"; switch (page) { case "Home": trace("Current page is Home"); break; case "Products": trace("Current page is Products"); break; case "Contact": trace("Current page is Contact"); break; } |
Do contrário, seriam executados todos os casos, ao invés de 1 como desejado. Uma vez que ele encontre o caso correspondente ao valor de page, a execução é interrompida.
continue
Mas, se no meu laço eu achar um valor que eu não deseje, mas ao invés de abandonar a execução de todos os laços, eu deseje apenas interromper o atual? É aí que entra o continue:
1 2 3 4 5 6 7 8 | var myArray:Array = new Array("one", "two", "three", "four", "five"); for each (var word:String in myArray) { if (word == "four") continue; trace(word); } |
one
two
three
five
Menos radical, o continue interrompe apenas o laço contendo o four, e prossegue para o próximo.
Vamos a um exemplo um pouco mais claro:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | var myMenuXML:XML = <menu> <item enabled="true"> <name>Home</name> <link>home.swf</link> </item> <item enabled="false"> <name>Products</name> <link>products.swf</link> </item> <item enabled="true"> <name>Contact</name> <link>contact.swf</link> </item> </menu>; for each (var node:XML in myMenuXML.children()) { var itemEnabled:Boolean = (node.attribute("enabled").toString() == "true"); if (!itemEnabled) continue; var itemName:String = node.name.toString(); trace(itemName); } |
Como pode ver, todo elemento que no XML estiver definido como enabled="false" não será tratado no laço, pois não existe a necessidade.
label
Existe uma situação que pode ocorrer quando utilizamos laços aninhados, por exemplo, um for dentro de outro. O que aconteceria se utilizássemos um break em um loop aninhado a outro?
1 2 3 4 5 6 7 8 9 10 11 12 13 | var myArray:Array = new Array("one", "two", "three", "four", "five"); for each (var word:String in myArray) { trace(word); for (var i:int = 0; i < 2; i++) { if (i == 1 && word == "four") break; trace(" " + i); } } |
one
0
1
two
0
1
three
0
1
four
0
five
0
1
Como pode ver ele obedeceu exatamente o que pedimos, parou a execução do laço em i == 1 && word == "four". Mas, a idéia fosse que ele parasse não só a execução de um laço, e sim de todos? É aí que entra a declaração label.
label é nada mais nada menos que um rótulo que nós iremos associar ao laço principal, de forma que quando declararmos break ou continue, possamos declarar no laço principal, ao invés do laço atual.
1 2 3 4 5 6 7 8 9 10 11 12 13 | var myArray:Array = new Array("one", "two", "three", "four", "five"); mainLoop: for each (var word:String in myArray) { trace(word); for (var i:int = 0; i < 2; i++) { if (i == 1 && word == "four") break mainLoop; trace(" " + i); } } |
one
0
1
two
0
1
three
0
1
four
0
Como esperado, a execução toda parou em i == 1 && word == "four". mainLoop é o nosso label, ou seja, o rótulo que associamos ao laço principal. Desta forma conseguimos interromper o laço principal ao invés de apenas o laço interno.
É isso aí pessoal, fica a pequena, e espero que útil, dica sobre as declarações break, continue e label.
Show suas explicações. não conhecia o break com label, mais uma que aprendo com vc em Petter!
Tudo de bom!
Abraço.
Essa pra mim também é nova, conhecia o continue e o break, agora o label nem sabia que existia.
Muito bom!!
T+
Parabens, adorei a materia, continue nos ajudando.