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