Язык программирования Crystal

while

while выполняет код в теле до тех пор, пока условие truthy.

while some_condition
  do_this
end

Прежде всего, проверяется условие, и если оно truthy, выполняется тело оператора. Именно поэтому код в теле может никогда не выполниться.

Тип while всегда Nil.

Аналогично с if, если условие while переменная, можно с уверенностью говорить, что в теле оператора она не будет nil. Если условие задаётся как var.is_a?(Type), var гарантированно будет типа Type в теле оператора. А если условие var.responds_to?(:method), то var гарантированно будет того типа, на который отвечает данный метод.

Тип переменной после выполнения while определяется тем типом, который был до выполнения while и тем, который был перед выходом из тела while.

a = 1
while some_condition
  # a : Int32 | String
  a = "hello"
  # a : String
  a.size
end
# a : Int32 | String

Проверка условия после выполнения цикла

Если вам необходимо выполнить код хотя бы один раз прежде, чем проверить условие, можете сделать так:

while true
  do_something
  break if some_condition
end

Или используйте loop из стандартной библиотеки:

loop do
  do_something
  break if some_condition
end