Евгений Легоцкой25 июня 2016 г. 2:07

User Guide #08 - Ruby - управляющие структуры

В данной главе больше поговорим об управляющих структурах в Ruby.

case

Мы используем оператор case для проверки последовательности условий. Это действительно очень похоже на switch в C и Java, но является более мощным инструментом, как мы увидим далее.

ruby> i=8
ruby> case i
    | when 1, 2..5
    |   print "1..5\n"
    | when 6..10
    |   print "6..10\n"
    | end
6..10
   nil

2..5 является выражением, которое означает диапазон между 2 и 5, включительно. Следующее выражение проверяет, что значение i лежит в этом диапазоне:

(2..5) === i

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

ruby> case 'abcdef'
    | when 'aaa', 'bbb'
    |   print "aaa or bbb\n"
    | when /def/
    |   print "includes /def/\n"
    | end
includes /def/
   nil

while

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

While является повторяемым if. Мы использовали этот цикл в программах для загадок и регулярных выражений (вы можете обратиться к предыдущей главе ). Итак, этот цикл состоит из оператора while, условия тела цикла и оператора end. Тело цикла будет обрабатываться до тех пор, пока условие будет возвращать true . Но при этом while может легко применяться и к отдельным строкам кода, и тогда оператор end не требуется.

ruby> i = 0
   0
ruby> print "It's zero.\n" if i==0
It's zero.
   nil
ruby> print "It's negative.\n" if i<0
   nil
ruby> print "#{i+=1}\n" while i<3
1
2
3
   nil

Иногда вы можете захотеть использовать проверку с отрицательным результатом. unless является противоположным вариантом if , и until является противоположным вариантов while. Мы оставим вас для экспериментов с этими операторами.

Имеется несколько способов прерывания прохождения цикла изнутри. Во-первых, break , который имеет тоже значение, что и в C, для выхода из петли. Во-вторых, next для запуска следующей итерации цикла (в C это continue ). В третьих, ruby имеет redo, который перезапускает текущую итерацию. Следующий код на С иллюстрирует значения break, next и redo.

while (condition) {
 label_redo:
   goto label_next;        /* ruby's "next" */
   goto label_break;       /* ruby's "break" */
   goto label_redo;        /* ruby's "redo" */
   ...
   ...
 label_next:
}
label_break:
...

Четвёртым способом выхода из петли является оператор return, внутри цикла. Но выполнение return вызывает не только выход из цикла, но и выход из метода, который содержит этот цикл. Если задан аргумент, то оператор вернёт значение из вызываемого метода, в противном случае будет возвращён nil.

for

C программистам будет интересно узнать, как можно использовать цикл for . В Ruby это делается немного интереснее. Цикл, представленный ниже запускается каждый раз для каждого элемента в коллекции:

for elt in collection
  ...
end

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

ruby> for num in (4..6)
    |    print num,"\n"
    | end
4
5
6
   4..6

Это может быть коллекция некоторого иного вида, например массив:

ruby> for elt in [100,-9.6,"pickle"]
    |    print "#{elt}\t(#{elt.type})\n"
    | end
100    (Fixnum)
-9.6   (Float)
pickle (String)
   [100, -9.6, "pickle"]

Но мы забегаем немного вперёд. for имеет ещё другой способ записи с методом each , как оказалось, и который рассмотрим в нашем первом примере с итератором. Следующие две формы будут эквивалентны:

#  Если вы использовали C или Java, то предпочитаете скорее всего такой стиль
for i in collection
  ...
end

#  Smalltalk программисты могут предпочитать такой стиль
collection.each {|i|
  ...
}

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

Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.
Поддержать автора Donate

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
Как стать автором?

Внесите вклад в развитие сообщества EVILEG.

Узнайте, как стать автором сайта.

Изучить
Donate

Добрый день, Дорогие Пользователи !!!

Я Евгений Легоцкой, разработчик EVILEG. И это мой хобби-проект, который помогает учиться программированию другим программистам и разработчикам

Если сайт помог вам, и вы хотите также поддержать развитие сайта, то вы можете сделать пожертвование следующими способами

PayPalYandex.Money
Timeweb

Позвольте мне порекомендовать вам отличный хостинг, на котором расположен EVILEG.

В течение многих лет Timeweb доказывает свою стабильность.

Для проектов на Django рекомендую VDS хостинг

Посмотреть Хостинг
КА

C++ - Тест 003. Условия и циклы

  • Результат:78баллов,
  • Очки рейтинга2
R

C++ - Тест 002. Константы

  • Результат:75баллов,
  • Очки рейтинга2
R

C++ - Тест 001. Первая программа и типы данных

  • Результат:73баллов,
  • Очки рейтинга1
Последние комментарии
V

Django - Урок 027. Добавление Google reCAPTCHA

Спасибо. Только использую декоратор не в urls.py а перед views
R

Qt WinAPI - Урок 001. Как собрать все DLL, используемые в Qt-проекте?

Вы меня не совсем правильно поняли, но все равно спасибо, принял все к сведению. Все сделал как вы сказали, все отлично работает, еще раз огромнейшее спасибо) Разве что только что были опять про…

Qt WinAPI - Урок 001. Как собрать все DLL, используемые в Qt-проекте?

Стоило перед использованием что ли инструкцию прочитать https://www.cyberforum.ru/blogs/131347/blog2457.html "После сборки при запуске требовались dll," Ясное дело стоило задепло…
R
R

Qt WinAPI - Урок 001. Как собрать все DLL, используемые в Qt-проекте?

Да, собралось. После сборки при запуске требовались dll, перекинул всю папки bin, plugins(не знаю как можно было сделать более умно). Как я понял в первой строке путь к екзешнику вставляю, втор…
Сейчас обсуждают на форуме

Как в Qt сохранить файл в папку загрузок в Android

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

QML+QtGraphicalEffects

да, сборку делал без параметра поиска qml, хотя dll QtGraphicalEffects он подтягивает, когда я добавил всю папку QtGraphicalEffects в проект - то заработало, похоже что именно qml-файлов ему не …

Не работают слоты/сигналы

и посмотрите работу с потоками в Qt, там подробно описано как передавать данные с одного в потока в другой при помощи сигналов и слотов

Как в Qt в qmenu добавить scrollarea

Вот это наследованный класс меню. Но посути это обычное меню. #pragma once#include <QtWidgets>class TransMenu : public QMenu { Q_OBJECTpublic: TransMenu(QWidget* parent = …

Qt C++ и Python

Красиво/некрасиво - это скорее моё личное отношение. Если есть возможность ограничить количество интсрументов, то лучше ограничить. Но не зацикливайтесь на этом. Если у вас есть скрипты Py…
О нас
Услуги
© EVILEG 2015-2020
Рекомендует хостинг TIMEWEB