Evgenii Legotckoi
Evgenii Legotckoi25 червня 2016 р. 02:07

Посібник користувача №08 - Ruby - керуючі структури

Зміст

У цьому розділі більше поговоримо про керуючі структури в Ruby.

справа

Ми використовуємо оператор 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

поки

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 *. У 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 хостинг.

Вам це подобається? Поділіться в соціальних мережах!

Коментарі

Only authorized users can post comments.
Please, Log in or Sign up
AD

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:50бали,
  • Рейтинг балів-4
m
  • molni99
  • 26 жовтня 2024 р. 01:37

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:80бали,
  • Рейтинг балів4
m
  • molni99
  • 26 жовтня 2024 р. 01:29

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:20бали,
  • Рейтинг балів-10
Останні коментарі
ИМ
Игорь Максимов22 листопада 2024 р. 11:51
Django - Підручник 017. Налаштуйте сторінку входу до Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
Evgenii Legotckoi
Evgenii Legotckoi31 жовтня 2024 р. 14:37
Django - Урок 064. Як написати розширення для Python Markdown Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
A
ALO1ZE19 жовтня 2024 р. 08:19
Читалка файлів fb3 на Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
ИМ
Игорь Максимов05 жовтня 2024 р. 07:51
Django - Урок 064. Як написати розширення для Python Markdown Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas505 липня 2024 р. 11:02
QML - Урок 016. База даних SQLite та робота з нею в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
Тепер обговоріть на форумі
Evgenii Legotckoi
Evgenii Legotckoi24 червня 2024 р. 15:11
добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
t
tonypeachey115 листопада 2024 р. 06:04
google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
NSProject
NSProject04 червня 2022 р. 03:49
Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…
9
9Anonim25 жовтня 2024 р. 09:10
Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

Слідкуйте за нами в соціальних мережах