Evgenii Legotckoi
Маусым 29, 2016, 12:51 Т.Қ.

№18 пайдаланушы нұсқаулығы - Ruby - процедуралық нысандар

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

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

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

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

  1. ruby> quux.call
  2. QUUXQUUXQUUX!!!
  3. nil

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

  1. ruby> def run( p )
  2. | print "About to call a procedure...\n"
  3. | p.call
  4. | print "There: finished.\n"
  5. | end
  6. nil
  7. ruby> run quux
  8. About to call a procedure...
  9. QUUXQUUXQUUX!!!
  10. There: finished.
  11. nil

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

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

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

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

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

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

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

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

Ол саған ұнайды ма? Әлеуметтік желілерде бөлісіңіз!

Пікірлер

Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
Кіріңіз немесе Тіркеліңіз