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