Оператор if в руби

Оператор if (англ. если) используется в руби для ветвления.

Ветвление — конструкция, которая управляет ходом выполнения программы. В зависимости от того, выполнено условие или нет, программа выполняет разные последовательности действий (разные «ветви»).

Ветвление в большинстве языков программирования делают с помощью условного оператора. В руби они, конечно, тоже есть. Один из них — if. Работает он как-то так:

if условие
  действие1
  действие2
  ...
end

Если условие после if выполнено, то выполняются действие1, действие2 и т.д. Если не выполнено — то не выполняются.

if и сравнение чисел

В качестве условия в руби используются выражения, которые руби проверяет на истинность.

Если условие возвращает true (истина), значит, оно выполнено, если false (ложь) — нет. Эти значения называются логическим или булевым (англ. Boolean) типом данных.

Для записи условия можно использовать, например, числа и операторы сравнения == (равно-равно), > (больше) , < (меньше), >= (больше или равно), <= (меньше или равно).

Давайте, например, напишем код, который проверяет человека на совершеннолетие:

puts "Сколько вам лет?"
age = gets.to_i

if age >= 18
  puts "Вам уже всё можно"
end

if age < 18
  puts "Вам ещё пока рановато!"
end

Если в переменной age окажется число, которое больше или равно 18 (например, 40) то такая программа напишет:

Вам уже всё можно

А если там будет число, которое меньше 18 (например, 16), то программа напишет:

Вам ещё пока рановато!

if и сравнение строк

Сравнивать можно не только цифры друг с другом, но и, например, строки.

Оператор «равно-равно» сравнивает строки (или числа) справа и слева от себя и если они равны, возвращает true, а если нет — false.

puts "Кто является создателем языка программирования Ruby?"
author = gets.chomp

if author == "Юкихиро Мацумото"
  puts "Вы совершенно правы!"
end

if author == "Билл Гейтс"
  puts "Вы не правы!"
end

Но все варианты (типа “Билл Гейтс” и т.д.) не переберешь, поэтому придумали оператор «не равно».

Если в операторе сравнения вместо первого равно поставить оператор ! то получится оператор неравенства, который будет возвращать true если операнды не равны друг другу.

puts "Кто является создателем языка программирования Ruby?"
author = gets.chomp

if author != "Юкихиро Мацумото"
  puts "Вы ошиблись!"
end

Логический оператор И

Условие после if можно объединять, чтобы сразу проверить несколько условий.

Например, если объединить два условия с помощью оператора && (логическое И), результат выражения будет true если оба условия выполнены (вернули true). Если хотя бы одно из условие не выполнено, результат выражения будет false.

puts "Сколько вам лет?"
your_age = gets.to_i

puts "Сколько лет другу/подруге?"
friend_age = gets.to_i

if your_age >= 18 && friend_age >= 18
  puts "Вы оба совершеннолетние"
end

Если хотя бы одно из значений будет меньше 18, то код внутри if не будет выполнен.

Логический оператор ИЛИ

Если нам надо, чтобы было выполнено хотя бы одно из условий, подойдет оператор || (логическое ИЛИ).

Результат выражения будет true если хоть одно из условий выполняется. А false будет только если оба условия (справа и слева от ||) не выполнены.

puts "Сколько вам лет?"
your_age = gets.to_i

puts "Сколько лет другу/подруге?"
friend_age = gets.to_i

if your_age >= 18 || friend_age >= 18
  puts "Кто то из вас точно совершеннолетний"
end

Если хотя бы одно из значений будет больше или равно 18, то код внутри if выполнится.

Логическое отрицание

Представим теперь, что нам нужно проверить, что какое-то условие не выполнено. Тут нам поможет оператор отрицания, который в руби записывается как восклицательный знак ! (логическое НЕ).

Его ставят перед условие, как бы добавляя к нему частицу «не». При подставлении перед чем-то, что раньше было true, результат нового выражения будет false. И наоборот, если выражение раньше возвращало false, то после отрицания оно будет принимать возвращать true.

puts "Сколько вам лет?"
age = gets.to_i

if !(age >= 18)
  puts "Вы не совершеннолетний"
end

Условия в переменных

При большом количестве логических операций в выражении, которые делают условие слишком длинным, принято выносить условие в отдельную переменную:

puts "Сколько вам лет?"
your_age = gets.to_i

puts "Сколько лет другу/подруге?"
first_friend_age = gets.to_i

puts "Сколько лет другому другу/другой подруге?"
second_friend_age = gets.to_i

ages_comparison = your_age >= 18 && first_friend_age >= 18 && second_friend_age >= 18

if ages_comparison
  puts "Вы все совершеннолетние"
end

Конструкция if-else

Если требуется выполнить какой-то другой код в случае, если условие не выполнено, используется конструкция if-else. Если условие будет принимать значение false, то будет выполнятся код, написанный внутри else:

puts "Сколько вам лет?"
age = gets.to_i

if age >= 18
  puts "Вам уже всё можно"
else
  puts "Вам ещё пока рановато!"
end

Конструкция if-elsif-else

Можно пойти дальше и добавить ещё веток.

Допустим, нам надо сделать так: если выполнено одно условие, сделать одно действие, а если не выполнено, то проверить другое условие и если оно выполнено, сделать другое действие. Ну, а если не выполнены оба условия, сделать третье.

Тогда можно воспользоваться конструкцией if-elsif-else. После проверки первого условия, если оно false конструкция переходит к проверке условия после elsif.

puts "Выберите направление?"
choice = gets.chomp

if choice == "направо"
  puts "Жену найдёшь"
elsif choice == "налево"
  puts "Богатство найдёшь"
else
  puts "Сам пропадёшь"
end

Оператор unless

Для выражений в которых требуется проверить ложность условия в руби принято вместо if !smth использовать выражение unless. Код будет выполняться, если условие будет false.

puts "Сколько вам лет?"
age = gets.to_i

unless age > 18
  puts "Вам ещё пока рано"
end

Однострочники с if / unless

При использовании операторов if / unless с одним действием (действием, которое умещается в одну строку) без использования else принято записывать сразу действие и if/else писать после действия.

В таком случае код похож на обычное предложение: «сделай что-то если условие выполнено.

puts "Сколько вам лет?"
age = gets.to_i

puts "Вам уже всё можно" if age >= 18

puts "Вам ещё пока рано" if age < 18

Удобно и наглядно.

Guard clause с однострочными if / unless *

* — для любознательных

Однострочные if и unless очень удобно использовать для охранных выражений (guard clause).

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

def adult?(age, country)
  return false if age < 16

  if country == 'ru' # Россия
    return age >= 18
  elsif country == 'cu' # Куба
    return age >= 16
  elsif country == 'kr' # Южная Корея
    return age >= 19
  end
end

Ни в одной стране (из перечисленных) человек не является совершеннолетним до 16 лет, поэтому сразу можно вернуть false если возраст меньше 16.

Это во-первых, наглядно, т.к. если того, кто читает код метода, интересует именно этот случай, он сразу поймет, что вернёт метод, а во-вторых, это позволяет сократить количество ненужных вычислений.

В ruby — всё true, кроме false (и nil) *

В отличие от других языков программирования, в руби все объекты (числа, строки, массивы и т.д.) вычисляются при подстановке в условные операторы как true (являются истиноподобными).

Это значит, что в условиях для if можно использовать любую переменную (число, строку и т.п.) и все они будут восприняты как true (условие будет выполнено).

a = 0

if a
  puts "Да, да! Не удивляйтесь!"
end

b = "Hello, World!"

if b
  puts b
end

В обоих случаях строка будет выведена на экран.

Только false и nil вычисляются как false и если их поставить после if, действие не будет выполнено. Код:

if nil
  puts "На нет и суда нет!"
end

не выведет на экран ничего.

Пользуйтесь if с умом!

Изучаешь руби?

Заходи в дружелюбный чат, задавай вопросы, делись опытом.

Присоединиться