Урок 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.

Мы рассмотрели с вами все операторы, позволяющие делать программе выбор. Потренироваться вы сможете в практическом занятии. А пока приготовьтесь изучать циклы.

<<Предыдущий урок                                                  Следующий урок>>

Комментарии

6 коммент. на “Урок 5: «Операторы unless и case»”
  1. Felix:

    Продолжай писать, братюнь ! Знай, что тебя читают !

  2. Виктор:

    Чел, почини кружки, не работают в хроме =)
    Красава ваще! Жаль, что не доводишь статьи по Руби до конца.

    • Вячеслав "VeGA" Головлев:

      Они могут не работать из-за рекламорезки. Тем не менее, постараюсь исправить эту проблему.
      Насчет уроков буду продолжать писать. Просто глядя на статистику просмотра данных статей невольно опускаются руки. У меня свой стиль изложения, ведь я стараюсь писать понятно, чтобы заинтересовать читателя. Поэтому написать подобную статью непросто.
      А когда нет обратной связи с читателем возникает масса сомнений в правильности подхода. Что ж, спасибо за отзыв. Продолжу цикл уроков по Рубину.

  3. sooik:

    В первом примере и втором есть ошибка, если запустить программу то даже если будешь вводить «Вячелав» и «123456» то не не увидешь «Доступ разрешен …» все потому что gets возвращает:

    «Вячелав \n»

    чтоб этого не была место gets нужно использовать gets.chomp. тогда когда пользователь введет «Вячелав» то так и будет а не «Вячелав \n» в случи примера выше

    • admin:

      Работа над ошибками, не так ли? К сожалению, я ничего не могу сказать по этим урокам. Вячеслав продал этот блог мне и я все уроки сотру, равно как и содержимое блога. Я уже начинаю понимать причины, вынудившие его продать programbeginner.ru

  4. Сергей:

    Если я правильно понимаю, оператор case — это аналог оператора switch в других языках. Отсюда вопрос обязательно ли после селектора писать только значение ( “dog”) или можно блок команд:
    case lang
    when :en : “dog”
    when :es : {a =1 b=2 c=3 puts (a+b+c)}
    else
    “собака”
    end

    И можно ли прервать этот перебор командой brake на каком-то этапе?

Добавить комментарий

Внимание! Не будут добавляться комментарии в виде откровенного спама или прямого анкора на свои сайты. Все спамеры будут передаваться в базу Akismet

Подтвердите, что Вы не бот — выберите человечка с поднятой рукой: