Evgenii Legotckoi
Evgenii Legotckoi29 июня 2016 г. 12:51

User Guide #18 - Ruby - процедурные объекты

Часто бывает так, что хотелось бы иметь возможность указать ответные действия на неожиданные события. Как выясняется, легче всего это сделать, если мы сможем передать блок кода в качестве аргумента другому методу, что означает, что мы хотим рассматривать код в качестве данных.

Новый процедурный объект формируется с использование оператора proc :

ruby> quux = proc {
    |   print "QUUXQUUXQUUX!!!\n"
    | }
   #<Proc:0x4017357c>

Это означает, что quux можно считать объектом, и как большинство объектов, он имеет такое же поведение, то есть может быть вызван. В частности, мы можем попросить его выполниться, через его метод call .

ruby> quux.call
QUUXQUUXQUUX!!!
   nil

Итак, после всего этого quux может быть использован в качестве аргумента метода? Конечно.

ruby> def run( p )
    |   print "About to call a procedure...\n"
    |   p.call
    |   print "There: finished.\n"
    | end
   nil
ruby> run quux
About to call a procedure...
QUUXQUUXQUUX!!!
There: finished.
   nil

Метод trap позволяет нам назначить ответ по нашему выбору на любой сигнал системы. То есть сделать обработчик сигналов от системы.

ruby> inthandler = proc{ print "^C was pressed.\n" }
   #<Proc:0x401730a4>
ruby> trap "SIGINT", inthandler
   #<Proc:0x401735e0>

Обычно нажатие сочетания клавиш Ctrl+C интерпретируется как выход. Сейчас же печатается сообщение и интерпретатор продолжает работать, поэтому мы не потеряли рабочий режим сделав этом. Но вы не захватили интерпретатор навсегда, вы всё еще можете выйти из интерпретатора, нажав сочетание клавиш Ctrl+D или напечатав exit )

Последнее замечание, прежде чем перейти к другим темам. Не обязательно именовать процедурный объекта для того, чтобы привязаться к сигналу от системы. Эквивалент анонимного процедурного объекта выглядит так:

ruby> trap "SIGINT", proc{ print "^C was pressed.\n" }
   nil

Или ещё более компактно:

ruby> trap "SIGINT", 'print "^C was pressed.\n"'
   nil

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

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

Вам это нравится? Поделитесь в социальных сетях!

Комментарии

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

Qt - Тест 001. Сигналы и слоты

  • Результат:84баллов,
  • Очки рейтинга4
Ua

Qt - Тест 001. Сигналы и слоты

  • Результат:42баллов,
  • Очки рейтинга-8
ОК

Qt - Тест 001. Сигналы и слоты

  • Результат:47баллов,
  • Очки рейтинга-6
Последние комментарии
ИМ
Игорь Максимов22 ноября 2024 г. 21:51
Django - Урок 017. Кастомизированная страница авторизации на Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
Evgenii Legotckoi
Evgenii Legotckoi31 октября 2024 г. 23:37
Django - Урок 064. Как написать расширение для Python Markdown Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
A
ALO1ZE19 октября 2024 г. 17:19
Читалка fb3-файлов на Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
ИМ
Игорь Максимов5 октября 2024 г. 16:51
Django - Урок 064. Как написать расширение для Python Markdown Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas55 июля 2024 г. 20:02
QML - Урок 016. База данных SQLite и работа с ней в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
Сейчас обсуждают на форуме
b
blinds1211 февраля 2025 г. 16:08
Why Bamboo Blinds Are the Perfect Choice for Your Home When it comes to enhancing the aesthetics and functionality of your living space, choosing the right window treatment is crucial. Bamboo blinds have emerged as a popular choice for homeowners wh…
i
imperial313011 февраля 2025 г. 15:40
How to Select the Right Carpet for Your Bedroom Aesthetic Choosing the perfect carpet for your bedroom involves more than just picking a color or pattern you like. Carpets can transform the ambiance of your space, adding warmth, comfort, and style. How…
c
carpetstore11 февраля 2025 г. 15:13
How to Choose the Perfect Red Carpet for Any Event A red carpet instantly adds elegance and sophistication to any event, making guests feel like VIPs. Whether you're hosting a corporate gala, a wedding, a movie premiere, or a private party, choo…
g
gypsumpartition11 февраля 2025 г. 12:24
Why Choose Gypsum Wall Partitions for Your Interior Design? When it comes to interior design, creating functional and aesthetically pleasing spaces is essential. One of the most versatile and practical solutions for dividing spaces is gypsum wall partiti…
Дмитрий
Дмитрий3 февраля 2025 г. 16:24
Создание deb-пакета. Как создать ярлык на рабочем столе после установки собственного deb-пакета? Всем привет. Сделал свой deb-пакет с программой. Всё устанавливается и работает. Ставлю по пути /usr/bin/my_application. Как для пользователя при установке пакета сразу создать ярлык на раб…

Следите за нами в социальных сетях