Опишите, как использовать управляющие структуры 'if-else'.ruby-30

Управляющие конструкции if-else - фундаментальный инструмент для ветвления логики в Ruby. Они позволяют выполнять разные участки кода в зависимости от условий.

Базовый синтаксис

1. Простой if

if condition
  # выполняется, если condition истинно (true)
end

Пример:

if 10 > 5
  puts "10 больше 5"
end
#=> "10 больше 5"

2. If-else

if condition
  # выполняется, если condition истинно
else
  # выполняется, если condition ложно (false)
end

Пример:

age = 18
if age >= 18
  puts "Доступ разрешен"
else
  puts "Доступ запрещен"
end
#=> "Доступ разрешен"

3. If-elsif-else

if condition1
  # блок 1
elsif condition2
  # блок 2
else
  # блок по умолчанию
end

Пример:

score = 85
if score >= 90
  puts "A"
elsif score >= 80
  puts "B"
elsif score >= 70
  puts "C"
else
  puts "D"
end
#=> "B"

Альтернативные формы записи

1. Модификатор if

expression if condition

Пример:

puts "Hello" if true
#=> "Hello"

2. Тернарный оператор

condition ? expression_if_true : expression_if_false

Пример:

age = 20
status = age >= 18 ? "adult" : "minor"
#=> "adult"

3. unless

unless condition
  # выполняется, если condition ложно
end

Пример:

unless user.logged_in?
  redirect_to login_path
end

Особенности условий в Ruby

  1. Ложные значения: только false и nil считаются ложными, все остальное - истина
  2. Сравнения: можно использовать ==, !=, >, <, >=, <=
  3. Логические операторы:
    • && (и)
    • || (или)
    • ! (не)

Пример сложного условия:

if user.admin? && (user.active? || user.super_admin?)
  grant_access
end

Лучшие практики

  1. Избегайте слишком сложных условий:

    # Плохо
    if user && user.profile && user.profile.address && user.profile.address.street
      puts user.profile.address.street
    end
    
    # Лучше
    if user&.profile&.address&.street
      puts user.profile.address.street
    end
    
  2. Используйте guard clauses для раннего возврата:

    def calculate_price(user, item)
      return 0 if user.nil? || item.nil?
      return 0 unless user.valid? && item.available?
    
      # основная логика
    end
    
  3. Предпочитайте позитивные проверки:

    # Лучше
    if user.active?
      # ...
    end
    
    # Чем
    unless user.inactive?
      # ...
    end
    

Пример комплексного использования

def categorize_temperature(temp)
  if temp <= 0
    "freezing"
  elsif temp > 0 && temp <= 15
    "cold"
  elsif temp > 15 && temp <= 25
    "warm"
  else
    "hot"
  end
end

puts categorize_temperature(10) #=> "cold"

Резюмируем: Управляющие конструкции if-else в Ruby предоставляют гибкий инструмент для ветвления логики. Выбирайте подходящую форму (полная, модификатор, тернарный оператор) в зависимости от контекста. Помните о лучших практиках - избегайте сложных вложенных условий, используйте guard clauses и безопасную навигацию (&.), предпочитайте позитивные проверки.