Политика конфиденциальностиКонтактыО сайтеОтзывыGitHubDonate
© EVILEG 2015-2018
Рекомендует хостинг
TIMEWEB

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

procedure objects, Ruby, ruby lesson, ruby уроки, user guide, процедурные объекты, руководство пользователя

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

Новый процедурный объект формируется с использование оператора 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

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

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
МК
13 января 2019 г. 20:35
Мария Канева

C++ - Тест 005. Структуры и Классы

  • Результат:91баллов,
  • Очки рейтинга8
МК
13 января 2019 г. 20:32
Мария Канева

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

  • Результат:70баллов,
  • Очки рейтинга1
МК
13 января 2019 г. 20:28
Мария Канева

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

  • Результат:78баллов,
  • Очки рейтинга2
Последние комментарии
I
16 января 2019 г. 8:06
IscanderChe

Заработало. Забыл model->select(); вписать.
I
16 января 2019 г. 8:02
IscanderChe

Всё равно пусто, хотя строка с данными в базу добавляется.
16 января 2019 г. 7:51
Евгений Легоцкой

потому, что нужно сохранять информацию для всех остальных ролей и столбцов через вызов переопределённого метода. Да к тому же вы ещё и зациклили вызов метода data. QVariant MySqlTableModel:...
I
16 января 2019 г. 7:43
IscanderChe

Сделал вот так. В tableView ничего нет, кроме заголовка. QVariant MySqlTableModel::data(const QModelIndex &index, int role) const{ if (role == Qt::DisplayRole) { QTime ...
Сейчас обсуждают на форуме
16 января 2019 г. 16:43
Михаиллл

Здравствуйте.Сделал Sleep в приложении так: QApplication::processEvents(); QThread::sleep(TimeSleep); На компьютере работает прекрасно.Но на андройде работает не прав...
15 января 2019 г. 16:53
Михаиллл

Спасибо, заработало.Но выдало обычный текст без форатирования HTML.Придется искать дальше
15 января 2019 г. 12:52
BlinCT

Я же вам выше написал CLion умеет работать с ремоут машинами. И Qt так же собирает.
ПБ
14 января 2019 г. 14:27
Павел Богдевич

Да
Присоединяйтесь к нам в социальных сетях

Для зарегистрированных пользователей на сайте присутствует минимальное количество рекламы