Um ciclo é uma estrutura de controlo que permite executar código repetidamente com base numa determinada condição.
Um ciclo while é uma estrutura de controlo que permite executar código repetidamente com base numa determinada condição. O código dentro de um ciclo while continua a ser executado enquanto a condição for avaliada como verdadeira. Os ciclos while são usados com frequência quando o número de iterações não é conhecido de antemão, mas podem ser usados em qualquer situação em que seja preciso um ciclo.
A condição é avaliada antes de o código dentro do ciclo ser executado. Isto significa que, se a condição for falsa, o código dentro do ciclo nunca chega a ser executado.
i = 0
while i < 3
puts i
i += 1
end
# Output:
# 0
# 1
# 2
Quando queres iterar sobre uma string, podes fazer um ciclo sobre o comprimento da string.
str = "Hello"
i = 0
while i < str.size
puts str[i]
i += 1
end
# Output:
# H
# e
# l
# l
# o
Os ciclos until funcionam da mesma forma que os ciclos while, com a diferença de que o código dentro do ciclo continua a ser executado até a condição ser 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 os ciclos while é entrar num "ciclo infinito", que nunca termina. Um ciclo infinito pode ser causado por uma condição que nunca é avaliada como verdadeira nem como falsa. Isto deve-se muitas vezes a um erro do programador, por exemplo, esquecer-se de incrementar a variável do ciclo. Mas, por vezes, um ciclo infinito é a forma mais clara de implementar a lógica do programa. Ou é vital repetir indefinidamente: por exemplo, um servidor HTTP espera por uma ligação recebida, trata-a e depois espera pela ligação seguinte.
A palavra-chave break pode ser usada para sair de um ciclo mais cedo.
Isto pode ser útil quando queres sair de um ciclo mais cedo em determinadas 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 saltar para a iteração seguinte de um ciclo.
Isto pode ser útil quando queres saltar iterações específicas de um ciclo.
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 ao longo do ciclo.
No exemplo seguinte, o tipo de a é Int32 | String porque pode ser Int32 ou String na primeira parte do ciclo.
A variável a só tem o tipo Int32 | String na primeira parte do ciclo, uma vez que, quando o ciclo começa, contém um Int32 e, na segunda iteração, contém uma String.
Este sistema de múltiplos tipos será explicado em detalhe mais adiante.
Mas, como temos a certeza de que a segunda parte do ciclo só conterá String, o tipo de a é String na segunda parte do ciclo.
Em tempo de execução, nunca conterá simultaneamente Int32 e String.
i = 0
a = 4
while i < 3
p typeof(a)
# => Int32 | String
a = "4"
p typeof(a)
# => String
i += 1
end
O while pode ser usado como expressão, o que significa que pode ser usado como o valor de uma variável.
O valor devolvido é o valor indicado na palavra-chave break.
Não devolve o valor da última expressão do ciclo.
a = while true
break 1
end
p a
# => 1
i = 0
a = while i == 0
i += 1
1
end
p a
# => nil