Мы кратко рассмотрели основные конструкции языка на первой лекции, а на этом занятии уделим время рассмотрению управляющих конструкций языка. Все конструкции языка расписаны в официальной документации и их можно посмотреть тут. Ввиду того, что официальная документация очень обширная, перевести её не представляется возможной задачей, поэтому в тексте данного документа рассмотрим только лишь основные моменты. Если что-то не понятно, то сразу обращаемся к официальной документации.

Условные оператор

Без условного оператора в программировании было бы нечего делать, поэтому начнём рассмотрение именно с его. В Ruby существует несколько вариантов условных операторов:

  • Классический оператор if
  • Тернарный условный оператор
  • Отрицающий-аналог unless
  • Условные операторы в форме модификаторов

Однако перед переходом к рассмотрению конкретных операторов нам необходимо определиться с тем что является правдой, а что является ложью в Ruby. Ruby по своей природе не очень тербователен к тому, что окажется в условии, и там действует достаточно простое правило:

  • Ложью является false (логическая константа, ложь) и nil (константа отсутствия значения)
  • Всё остальное является правдивым значением

Условный оператор if

Рассмотрим полную форму условного оператора.

a = 1

if a == 0
  puts 'В переменной а записано число 0'
elsif a == 1
  puts 'В переменной a записано число 1'
elsif a > 1
  puts 'В переменной a записано число больше 1'
else
  puts 'В переменной a записано другое число'
end
  • Условие пишется сразу после if до конца строки
  • Альтернативные условия пишутся на отдельных строках после elsif
  • Альтернативное безусловное действие пишется после else

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

Тернарный оператор создан, чтобы делать код ещё более сложным и нечитаемым.

input_type = gets =~ /hello/i ? "greeting" : "other"

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

input_type =
  if gets =~ /hello/i
    "greeting"
  else
    "other"
  end

Условный оператор unless

Если ваше условное выражение не должно выполняться, то есть условие неверно, тогда удобно использовать оператор unless. У данного оператора также есть возможность описать альтернативный поток выполнения, но нет возможности описать альтернативные условия.

unless false
  puts "Этот блок БУДЕТ выполнен"
else
  puts "Этот блок НЕ будет выполнен"
end

Операторы в форме модификаторов

Операторы if и unless могут быть написаны после любого выражения. Таким образом это выражение будет выполняться только лишь в том случае, если условное выражение верно.

В результате данного кода в переменной a будет записана 1

a = 0
a += 1 if a.zero?
p a

А в результате этого кода в переменной a будет записан 0

a = 0
a += 1 unless a.zero?
p a

Не следует их очень часто применять, особенно в сложных ситуацях. Но если при их применении код остаётся понятным, то следует их использовать.

Оператор ветвления case

С помощью case-выражения вы можете сравнить значение с набором шаблонов. И выполнить в зависимости от этого определённые задачи.

Рассмотрим пример оператора ветвления:

a = '2'
case a
when /^1/, "2"
  puts 'строка начинается с числа 1 или является строкой \'2\''
when /^3/
  puts 'строка начинается с числа 3'
else
  puts 'неизвестная строка'
end

После ключевого слова case пишется выражение. Значение этого выражения затем проверяется относительно условий, которые написаны после ключевого слова when. Сравнение происходит с помощью оператора ===. Литерал /^1/ описывает регулярное выражение, строку, которая начинается с символа единицы.

Для большиства типов сравнение идентично сравнению с помощью ==, однако для ряда классов реализовано дополнительное сравнине. Например для классов, реализующих регулярные выражения или промежутки. Ниже представлен пример работы с промежутками чисел. Пожалуйста обратите внимание на количество точек между границами промежутков - это важно.

num = 150
case num
when 1...50
  puts 'Число от 1 до 49'
when 50..99
  puts 'Число от 50 до 99'
else
  puts 'Другое число'
end

Практические задачи

Исследуем условный оператор if

Напишите приложение, которое будет просить пользователя ввести вещественное число.

  • Если число больше нуля, тогда вывести “положительное число”.
  • Если число меньше нуля, тогда вывести “не положительное, а отрицательное число”.
  • Если число равну нулю, тогда вывести “непонятное число”.

Приложение должно выводить информацию о работе, приветствие для ввода данных. Реализуйте приложение с помощью условного оператора if, реализуйте проверку на правильность ввода.

Игра на рынке

Напишите приложение, которое будет считывать положительное вещественное число - объём изначальных инвестиций. Затем предложите пользователю варианты: подождать на рынке и снять. Если пользователь решит снять деньги, то приложение завершает свою работу и выводит информацию о текущем состоянии счёта (выигрыш на рынке).

Если пользователь решил остаться на рынке, то происходит “игра”. В зависимости от случайного значения, которое вернёт метод rand(15) выполните:

  • Больше 14 - повысьте счёт на 10%
  • Больше 12 - повысьте счёт на 2%
  • Больше 9 - оставьте счёт неизменным
  • Больше 7 - отнимите со счёта 2%
  • Больше 5 - отнимите со счёта 10%
  • Остальное - отнимите со чёта 50%

По окончании игры приложение должно показать пользователю текущее состояние счёта и спросить: подождать на рынке или снять деньги со счёта.

Приложение должно выводить информацию о своей работе, приветствие для ввода данных, проверку на правильность ввода. Реализуйте приложение с помощью оператора ветвления case.

Заполнение формы

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

Пользователь вводит следующие данные:

  • Имя и фамилию, непустая строка.
  • Адрес электроной почты, непустая строка.
  • Возраст, положительное число от 15 до 100.
  • Стаж работы в профессии, положительное число.

Приложение должно показать справку об использовании, показывать приглашения для ввода данных и проверять их корректность.

После ввода данных приложение должно проверять данные и показывать список должностей, на которые может претендавать кандидат. Для проверки и вывода свойств используйте модификаторы if и unless.

  • Профессия «Руководитель», если имя и фамилия совпадает с «Пётр Петрович».
  • Профессия «Инженер», если адрес электронной почты включает в себя строку “code”. Проверяйте с помощью метода String#include?.
  • Профессия «Стажёр», если стаж работы в профессии меньше двух лет.
  • Профессия «Бывалый», если возраст от 45 до 60.
  • Добавьте к професии слово “Заслуженный”, если стаж работы в профессии больше 15 лет.
  • Добавьте к професси слово “Известный”, если стаж работы в профессии больше 5 лет.

Решение задачи №12 из пункта 1.2 задачника

Реализуйте приложение, решающее задачу №12 из пункта 1.2 задачника. Приложение должно выводить справу об испсользовании, проверять правильность ввода. Желательно использовать различные варианты логических операторов при выполнении сравнений.