Um laço é uma estrutura de controle que permite executar código repetidamente com base em uma determinada condição.
while
Um laço while é uma estrutura de controle que permite executar código repetidamente com base em uma determinada condição.
O código dentro de um laço while continua sendo executado enquanto a condição for avaliada como verdadeira.
Os laços while são usados com frequência quando o número de iterações é desconhecido de antemão, mas podem ser usados em qualquer situação que precise de um laço.
A condição é avaliada antes de o código dentro do laço ser executado. Isso significa que, se a condição for falsa, o código dentro do laço nunca será executado.
i = 0
while i < 3
puts i
i += 1
end
# Output:
# 0
# 1
# 2
Quando você quiser iterar sobre uma string, pode percorrer o comprimento dela com um laço.
str = "Hello"
i = 0
while i < str.size
puts str[i]
i += 1
end
# Output:
# H
# e
# l
# l
# o
until
Os laços until funcionam igual aos laços while, exceto que o código dentro do laço continua sendo executado até que a condição seja avaliada como verdadeira.
É a mesma diferença que existe entre if e unless.
i = 0
until i == 3
puts i
i += 1
end
Um erro comum com laços while é entrar em um "laço infinito", que nunca termina.
Um laço infinito pode ser causado por uma condição que nunca é avaliada como verdadeira ou falsa.
Isso geralmente acontece por erro de quem programa; por exemplo, esquecer de incrementar a variável do laço.
Mas, às vezes, um laço infinito é a forma mais clara de implementar a lógica do programa.
Ou pode ser essencial repetir para sempre; por exemplo, um servidor HTTP espera por uma conexão de entrada, trata essa conexão e depois espera pela próxima.
A palavra-chave break pode ser usada para sair de um laço antes do fim.
Isso pode ser útil quando você quer sair de um laço antes do fim sob certas condições.
i = 0
while i <= 3
puts i
i += 1
if i == 2
break
end
end
# Output:
# 0
# 1
A palavra-chave next pode ser usada para pular para a próxima iteração de um laço.
Isso pode ser útil quando você quer pular iterações específicas de um laço.
i = 0
while i <= 3
i += 1
if i == 2
next
end
puts i
end
# Output:
# 1
# 3
O tipo da variável pode ser diferente dentro de um laço.
No exemplo a seguir, o tipo de a é Int32 | String, porque ele pode ser Int32 ou String na primeira parte do laço.
A variável a só carrega o tipo Int32 | String na primeira parte do laço, já que, quando o laço começa, ela contém Int32 e, na segunda iteração, contém uma String.
Esse sistema de múltiplos tipos será explicado em detalhes mais adiante.
Mas, como temos certeza de que a segunda parte do laço só conterá String, o tipo de a é String na segunda parte do laço.
Em tempo de execução, ela nunca conterá Int32 e String ao mesmo tempo.
i = 0
a = 4
while i < 3
p typeof(a)
# => Int32 | String
a = "4"
p typeof(a)
# => String
i += 1
end
while como expressãoO while pode ser usado como uma expressão, o que significa que ele pode ser usado como o valor de uma variável.
O valor retornado é o valor passado com a palavra-chave break.
Ele não retorna o valor da última expressão do laço.
a = while true
break 1
end
p a
# => 1
i = 0
a = while i == 0
i += 1
1
end
p a
# => nil