Урок 5: «Операторы unless и case»
Этот урок продолжает тему использования условий в Ruby скриптах. На прошлом уроке мы с вами разобрали оператор if then else. На этом уроке мы окончательно рассмотрим все варианты реализации выбора в Ruby.
Matz (это его ник), создатель Ruby, внес в него такой оператор из Perl, как unless (если не). Фактически, этот оператор является своеобразным антонимом if. Для того, чтобы понять, зачем он вообще нужен, рассмотрим пример.
Итак, представьте себе, что вы пишите программу, где нужно ввести имя пользователя и его пароль для входа в программу (поверьте, благодаря модулям на Ruby очень просто написать программу с графическим интерфейсом. Кстати, сейчас есть тенденция, когда отличные программы пишут на Python или Ruby). Давайте напишем код с традиционным if:
puts “ Для запуска программы введите свое имя” name=gets.chomp puts “Введите пароль для доступа к данным” passw=gets.chomp #Правильное имя здесь будет «Вячеслав», а пароль «123456» if name==”Вячеслав” && passw ==”123456” then puts “Доступ разрешен. Добро пожаловать” else puts “Доступ запрещен. Программа будет закрыта” end
Как видите, я проверяю имя и пароль на совпадение с базой данных. Если все верно, то скрипт пишет, что доступ разрешен, если нет – доступ запрещен. Оператор unless проверяет отрицание. Посмотрите сами:
puts “ Для запуска программы введите свое имя” name=gets.chomp puts “Введите пароль для доступа к данным” passw=gets.chomp unless name==”Вячеслав” && passw ==”123456” then puts “Доступ запрещен. Программа будет закрыта” else puts “Доступ разрешен. Добро пожаловать” end
Уловили разницу? Здесь почти тоже самое, вот только теперь проверяется на условие, если не соответствуют данные введенные с клавиатуры. Это как бы инвертированный вариант if, в котором теперь выражения после then и else поменялись местами. Честно говоря, этим оператором я почти никогда не пользуюсь, однако вы должны знать о его существовании. В этом примере вместо unless можно спокойно обойтись оператором отрицания !=. Смысл будет тот же самый. Но, как говорится, из песни слов не выкинешь и нужно привыкать к подобному синтаксису. Но, повторюсь, без unless можно спокойно обойтись.
Ну и в завершение об этом операторе хотелось бы сказать, что с unless допустим прием, который я демонстрировал в предыдущем уроке с if. Рассмотрим пример с зарплатой
puts “ Маловато. Нужно добавить” unless salary >25000
Как видите, в примере если зарплата не больше 25000 рублей, на экран выдается «Маловато будет».
В остальном правила синтаксиса unless практически схожи с if. Поэтому на этом я останавливаться не буду.
Тернарный оператор
Этот оператор достался языку от C. Причем синтаксис этого оператора остался неизменным:
условие ? выражение, если истина : выражение, если ложь (тот же иначе)
Тернарный оператор не так распространен, как тот же if, однако иногда он может быть весьма полезен. Главное его достоинство – краткость синтаксиса.
Давайте рассмотрим его применение на сквозном примере:
otpusk=”да”# отпуск label=otpusk==”да” ? “Удачного отдыха!” : “Что ж, и на работе неплохо” puts label
Здесь я присваиваю переменной label одно из двух значений, которое вернется после сравнения условия. Посмотрите на синтаксис примера и сравните его с оператором if. Думаю, вы поймете, как и где использовать тернарный оператор.
Оператор множественного выбора case
Мы с вами рассмотрели в прошлом уроке ситуацию, когда проверяли множественное условие посредством elsif. Хотя я и привел практически бесполезный пример с собакой, в программировании подобные ситуации встречаются сплошь и рядом. Часто приходится писать меню или проверять, какую кнопку нажал пользователь. Безусловно, решить такие задачи посредством elsif можно. Perl тот до сих пор прекрасно обходится подобным решением. Однако Matz справедливо рассудил, что в Ruby должен быть оператор множественного выбора. Так, оператор case перекочевал из C в Ruby.
Почему case называется оператором множественного выбора? Потому, что его конструкция представляет собой выбор выражения в зависимости от селектора, который и является условием. Помните пример с собакой, где скрипт выдавал на экран слово «собака» на разных языках, в зависимости от языка ввода? В этом примере язык ввода как раз и являлся селектором.
Синтаксис case/when такой:
case селектор
when вариант : значение
…
else
вариант по-умолчанию
end
Оператор case работает значительно быстрее if elsif и существенно экономит время на вводе кода. Где это только возможно, старайтесь применять case вместо if elsif. Давайте рассмотрим применение этого оператора на примере с собакой. Кстати, еще одно замечательное свойство этого оператора – он может возвращать значение, что мы и продемонстрируем
lang= :ru returnValue= case lang when :en : “dog” when :es : “perro” when :de : “Hund” when :ru : “собака” else “собака” end puts returnValue
Как видите, код намного короче. Кроме того, он более гибкий. Вариант примера с собакой я нарочно выбрал, чтобы вы смогли сравнить его с той же задачей из урока 4, но только с использованием конструкции if elsif.
Мы рассмотрели с вами все операторы, позволяющие делать программе выбор. Потренироваться вы сможете в практическом занятии. А пока приготовьтесь изучать циклы.