Оператор if
(англ. если) используется в руби для ветвления.
Ветвление — конструкция, которая управляет ходом выполнения программы. В зависимости от того, выполнено условие или нет, программа выполняет разные последовательности действий (разные «ветви»).
Ветвление в большинстве языков программирования делают с помощью условного оператора. В руби они, конечно, тоже есть. Один из них — if
. Работает он как-то так:
if условие
действие1
действие2
...
end
Если условие после if
выполнено, то выполняются действие1, действие2 и т.д. Если не выполнено — то не выполняются.
В качестве условия в руби используются выражения, которые руби проверяет на истинность.
Если условие возвращает true
(истина), значит, оно выполнено, если false
(ложь) — нет. Эти значения называются логическим или булевым (англ. Boolean) типом данных.
Для записи условия можно использовать, например, числа и операторы сравнения ==
(равно-равно), >
(больше) , <
(меньше), >=
(больше или равно), <=
(меньше или равно).
Давайте, например, напишем код, который проверяет человека на совершеннолетие:
puts "Сколько вам лет?"
age = gets.to_i
if age >= 18
puts "Вам уже всё можно"
end
if age < 18
puts "Вам ещё пока рановато!"
end
Если в переменной age
окажется число, которое больше или равно 18 (например, 40) то такая программа напишет:
Вам уже всё можно
А если там будет число, которое меньше 18 (например, 16), то программа напишет:
Вам ещё пока рановато!
Сравнивать можно не только цифры друг с другом, но и, например, строки.
Оператор «равно-равно» сравнивает строки (или числа) справа и слева от себя и если они равны, возвращает 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
. Если условие будет принимать значение false
, то будет выполнятся код, написанный внутри else
:
puts "Сколько вам лет?"
age = gets.to_i
if age >= 18
puts "Вам уже всё можно"
else
puts "Вам ещё пока рановато!"
end
Можно пойти дальше и добавить ещё веток.
Допустим, нам надо сделать так: если выполнено одно условие, сделать одно действие, а если не выполнено, то проверить другое условие и если оно выполнено, сделать другое действие. Ну, а если не выполнены оба условия, сделать третье.
Тогда можно воспользоваться конструкцией if-elsif-else
. После проверки первого условия, если оно false
конструкция переходит к проверке условия после elsif
.
puts "Выберите направление?"
choice = gets.chomp
if choice == "направо"
puts "Жену найдёшь"
elsif choice == "налево"
puts "Богатство найдёшь"
else
puts "Сам пропадёшь"
end
Для выражений в которых требуется проверить ложность условия в руби принято вместо if !smth
использовать выражение unless
. Код будет выполняться, если условие будет false
.
puts "Сколько вам лет?"
age = gets.to_i
unless age > 18
puts "Вам ещё пока рано"
end
При использовании операторов if
/ unless
с одним действием (действием, которое умещается в одну строку) без использования else
принято записывать сразу действие и if
/else
писать после действия.
В таком случае код похож на обычное предложение: «сделай что-то если условие выполнено.
puts "Сколько вам лет?"
age = gets.to_i
puts "Вам уже всё можно" if age >= 18
puts "Вам ещё пока рано" if age < 18
Удобно и наглядно.
* — для любознательных
Однострочные 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.
Это во-первых, наглядно, т.к. если того, кто читает код метода, интересует именно этот случай, он сразу поймет, что вернёт метод, а во-вторых, это позволяет сократить количество ненужных вычислений.
В отличие от других языков программирования, в руби все объекты (числа, строки, массивы и т.д.) вычисляются при подстановке в условные операторы как 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
с умом!