37
LESSON 3: BLOCK, PROC AND LAMBDA DYNAMIC RUBY

Dynamic Ruby. Lesson #3: Blocks, procs and lambdas

Embed Size (px)

Citation preview

Page 1: Dynamic Ruby. Lesson #3: Blocks, procs and lambdas

LESSON 3: BLOCK, PROC AND LAMBDA

DYNAMIC RUBY

Page 2: Dynamic Ruby. Lesson #3: Blocks, procs and lambdas

BLOCKS

Page 3: Dynamic Ruby. Lesson #3: Blocks, procs and lambdas

BLOCKS

BLOCK

Page 4: Dynamic Ruby. Lesson #3: Blocks, procs and lambdas

BLOCKS

В других языках схожие синтаксические конструкции называют “замыкания”. В некотором смысле блоки ведут себя как анонимные методы.

Page 5: Dynamic Ruby. Lesson #3: Blocks, procs and lambdas

BLOCKS

Нечто похожее на метод

▸ имеет свою локальную область видимости переменных;

▸ имеет возвращаемое значение;

▸ может принимать аргументы;

▸ Имеют обособленный контекст как в отношении переменных, так и возвращаемого значения (с некоторой спецификой);

▸ имеет доступ к переменным, которые были объявлены в том же контексте, в котором был описан блок;

▸ ключевое слово return не используется - в контексте main оно вызовет exception LocalJumpError, в контексте любой иной функции приведет к выходу из нее;

▸ при вызове можно передавать иное число аргументов, чем было объявлено;

▸ имеет отличительный синтаксис объявления;

Нечто непохожее на метод

Page 6: Dynamic Ruby. Lesson #3: Blocks, procs and lambdas

BLOCKS

{ }

DO END

: более высокий приоритет

: более низкий приоритет

Синтаксически блоки описываются при помощи ключевых символов:

Page 7: Dynamic Ruby. Lesson #3: Blocks, procs and lambdas

BLOCKS

YIELD

BLOCK_GIVEN?

: вызов блока внутри метода

: проверка на наличие передаваемого блока в методе

Прочие особенности синтаксиса блоков:

{ |PARAM| … } : синтаксис описания принимаемых блоком параметров

Page 8: Dynamic Ruby. Lesson #3: Blocks, procs and lambdas

BLOCKS

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

Page 9: Dynamic Ruby. Lesson #3: Blocks, procs and lambdas

BLOCKS

Page 10: Dynamic Ruby. Lesson #3: Blocks, procs and lambdas

ITERATORS

Page 11: Dynamic Ruby. Lesson #3: Blocks, procs and lambdas

ITERATORS

ITERATOR

Page 12: Dynamic Ruby. Lesson #3: Blocks, procs and lambdas
Page 13: Dynamic Ruby. Lesson #3: Blocks, procs and lambdas

ITERATORS

EACH, MAP, SELECT, FIND, TIMES…

Так вот, многие из итераторов вам уже должны быть знакомы:

Все они работают с блоками.

Page 14: Dynamic Ruby. Lesson #3: Blocks, procs and lambdas

ITERATORS

Page 15: Dynamic Ruby. Lesson #3: Blocks, procs and lambdas

ITERATORS

Напишем собственный итератор:

Page 16: Dynamic Ruby. Lesson #3: Blocks, procs and lambdas

PROCS

Page 17: Dynamic Ruby. Lesson #3: Blocks, procs and lambdas

PROCS

PROC

Page 18: Dynamic Ruby. Lesson #3: Blocks, procs and lambdas

PROCS

В чем смысл такого представления? В том, что теперь блок кода не подвязан к вызову метода yield и не обременен соответствующими ограничениями.

Page 19: Dynamic Ruby. Lesson #3: Blocks, procs and lambdas
Page 20: Dynamic Ruby. Lesson #3: Blocks, procs and lambdas

PROCS

Page 21: Dynamic Ruby. Lesson #3: Blocks, procs and lambdas

PROCS

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

Page 22: Dynamic Ruby. Lesson #3: Blocks, procs and lambdas

PROCS

Page 23: Dynamic Ruby. Lesson #3: Blocks, procs and lambdas

PROCS

Впрочем, это все равно не отменяет концептуальных ограничений блока.

С методом может быть связан только один блок и его нельзя присвоить переменной.

Page 24: Dynamic Ruby. Lesson #3: Blocks, procs and lambdas

PROCS

Зато все виды процедурных объектов могут вызываться неявно.

Для этого достаточно указать в описании метода, который будет вызывать proс, псевдоаргумент, начинающийся с &.

Page 25: Dynamic Ruby. Lesson #3: Blocks, procs and lambdas

PROCS

Page 26: Dynamic Ruby. Lesson #3: Blocks, procs and lambdas

PROCS

Любой объект, реализующий метод to_proc и возвращающий процедурный объект, может быть передан методу как псевдоаргумент.

Page 27: Dynamic Ruby. Lesson #3: Blocks, procs and lambdas

PROCS

Page 28: Dynamic Ruby. Lesson #3: Blocks, procs and lambdas

PROCS

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

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

Page 29: Dynamic Ruby. Lesson #3: Blocks, procs and lambdas

PROCS

Page 30: Dynamic Ruby. Lesson #3: Blocks, procs and lambdas

LAMBDAS

Page 31: Dynamic Ruby. Lesson #3: Blocks, procs and lambdas

LAMBDAS

LAMBDA

Page 32: Dynamic Ruby. Lesson #3: Blocks, procs and lambdas

LAMBDAS

Proc

▸ return прерывает выполнение метода, в котором описан proc;

▸ не требует строгого соответствия аргументов;

▸ return прерывает выполнение самой lambda, возвращаясь в метод, в котором была описана lambda;

▸ требует строгого соответствия аргументов;

Lambda

Page 33: Dynamic Ruby. Lesson #3: Blocks, procs and lambdas

LAMBDAS

Их синтаксис, как и представление, тоже отличаются:

Page 34: Dynamic Ruby. Lesson #3: Blocks, procs and lambdas

LAMBDAS

У lambda есть еще один дополнительный вариант записи:

Ruby style guide рекомендует такой вид записи для однострочных лямбд.

Page 35: Dynamic Ruby. Lesson #3: Blocks, procs and lambdas

BLOCKS, PROCS AND LAMBDAS

REFERENCES

▸ http://nashbridges.me/blocks-in-ruby

▸ http://nashbridges.me/procs-and-lambdas

▸ http://www.skorks.com/2013/04/ruby-ampersand-parameter-demystified/

▸ http://awaxman11.github.io/blog/2013/08/05/what-is-the-difference-between-a-block/

Page 36: Dynamic Ruby. Lesson #3: Blocks, procs and lambdas

THANK YOU!

Alex Mikitenko [email protected] https://github.com/nonkor

Page 37: Dynamic Ruby. Lesson #3: Blocks, procs and lambdas

TO BE CONTINUED…