Ruby предлагает стандартный control-flow (if, , ), но с характерными, выразительными особенностями: (), , мощный и предпочтение вместо традиционных циклов. Control flow в Ruby читается естественно.
casewhiledo_x if conditionunlesscase/whenif age >= 18
puts "adult"
elsif age >= 13
puts "teen"
else
puts "child"
end
# MODIFIER form — condition at the END (reads like English, idiomatic for short cases)
puts "adult" if age >= 18
puts "minor" unless age >= 18 # `unless` = if not (more readable than `if !`)
# everything is an expression — if returns a value
grade = if score >= 90 then "A" else "B" end
Руби модификаторная форма (puts "x" if condition) помещает условие в конце для кратких, читаемых однострочников. unless (= "если не") звучит более естественно, чем отрицание. И if является выражением, которое возвращает значение.
case status
when :active then "running"
when :stopped, :paused then "halted" # multiple values
when 1..10 then "small number" # ranges
when String then "it's a string" # types (uses ===)
else "unknown"
end
# case can also do structural pattern matching (Ruby 3)
case data
in { name: String => name, age: Integer } # pattern matching with destructuring
puts name
end
case/when в Ruby мощный — он сопоставляет значения, диапазоны, типы и (в Ruby 3) структурные образцы, используя === под капотом. Гораздо более гибкий, чем базовый switch.
while count < 10 do count += 1 end
until done do ... end # until = while not
# ✅ but Ruby PREFERS iteration with blocks over explicit loops:
5.times { |i| puts i } # instead of a for loop
[1, 2, 3].each { |n| puts n } # iterate a collection
(1..10).each { |n| ... } # iterate a range
1.upto(5) { |i| ... }
В Ruby есть while/until, но идиоматический Ruby предпочитает итерацию с блоками (each, times, map) явным циклам — более выразительно и в стиле Ruby.
Понимание control flow в Ruby — это фундаментальное ежедневное знание, и несколько характерных особенностей отражают философию Ruby, ориентированную на выразительность и читаемость.
Модификаторная форма (do_x if condition) и unless (= "если не") позволяют писать краткие, похожие на английский язык условные операторы, которые идиоматичны для Ruby и встречаются постоянно.
Тот факт, что if является выражением (возвращающим значение), позволяет использовать элегантные присваивания.
case/when в Ruby особенно мощный — сопоставление значений, диапазонов, типов и (в Ruby 3) структурных образцов через === — делает его намного более гибким, чем базовый switch, и полезным для чистого многовариантного ветвления.
Критически важно то, что идиоматический Ruby предпочитает итерацию с блоками (each, times, map, upto) традиционным циклам for/while — это определяющий стилистический момент: разработчики Ruby итерируют коллекции и диапазоны методами на основе блоков, а не явными циклами, что более выразительно и соответствует стилю Ruby.
Понимание этих конструкций и идиом — модификаторная форма и unless для читаемых условных операторов, мощный case/when и особенно предпочтение итерации на основе блоков перед явными циклами — важно для написания и чтения идиоматического Ruby.
Поскольку control flow появляется в каждой программе, и поскольку выразительные формы Ruby (модификаторы, unless, мощный case, итерация блоками) воплощают его философию, ориентированную на читаемость, их освоение — это важное, фундаментальное знание для написания естественного, идиоматического Ruby вместо переведения насыщенных циклами паттернов из других языков.