4. BLOCKS
В других языках схожие
синтаксические конструкции
называют “замыкания”. В некотором
смысле блоки ведут себя как
анонимные методы.
5. BLOCKS
Нечто похожее на метод
▸ имеет свою локальную область видимости
переменных;
▸ имеет возвращаемое значение;
▸ может принимать аргументы;
▸ Имеют обособленный контекст как в
отношении переменных, так и
возвращаемого значения (с некоторой
спецификой);
▸ имеет доступ к переменным, которые были
объявлены в том же контексте, в котором
был описан блок;
▸ ключевое слово return не используется - в
контексте main оно вызовет exception
LocalJumpError, в контексте любой иной
функции приведет к выходу из нее;
▸ при вызове можно передавать иное число
аргументов, чем было объявлено;
▸ имеет отличительный синтаксис
объявления;
Нечто непохожее на метод
6. BLOCKS
{ }
DO
END
: более высокий приоритет
: более низкий приоритет
Синтаксически блоки описываются
при помощи ключевых символов:
7. BLOCKS
YIELD
BLOCK_GIVEN?
: вызов блока внутри метода
: проверка на наличие
передаваемого блока в
методе
Прочие особенности синтаксиса
блоков:
{ |PARAM| … }
: синтаксис описания
принимаемых блоком
параметров
8. BLOCKS
Блоки передаются всегда последним
параметром. В большинстве случаев
эта передача происходит сразу по
факту описания, но так же блок
можно передать как процедурный
объект (об этом позже).
18. PROCS
В чем смысл такого представления?
В том, что теперь блок кода не
подвязан к вызову метода yield и не
обременен соответствующими
ограничениями.
21. PROCS
Как мы видим, одно из ключевых
отличий блока от прока в том, что
последний легко передавать как
параметр.
На самом деле, конкретный код
модифицировать, чтобы передача
блока как параметра все же
состоялась.
23. PROCS
Впрочем, это все равно не отменяет
концептуальных ограничений блока.
С методом может быть связан только
один блок и его нельзя присвоить
переменной.
24. PROCS
Зато все виды процедурных объектов
могут вызываться неявно.
Для этого достаточно указать в
описании метода, который будет
вызывать proс, псевдоаргумент,
начинающийся с &.
28. PROCS
Существует синтаксический сахар,
который позволяет передавать
вместо блока просто символ.
Таким образом будет определен
блок, в котором к аргументу блока
будет вызываться одноименный с
символом метод.
32. LAMBDAS
Proc
▸ return прерывает
выполнение метода, в
котором описан proc;
▸ не требует строгого
соответствия аргументов;
▸ return прерывает
выполнение самой lambda,
возвращаясь в метод, в
котором была описана
lambda;
▸ требует строгого
соответствия аргументов;
Lambda