HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-02-26
1 <p>Блоки в Ruby - очень важная концепция, которая встречается на каждом шагу. У неё нет аналогов в популярных языках, поэтому при изучении блоков сложно опираться на прошлый опыт. К счастью, их не так сложно понять, особенно если у вас есть опыт работы с лямбда-функциями (анонимными функциями). Начнём с примера:</p>
1 <p>Блоки в Ruby - очень важная концепция, которая встречается на каждом шагу. У неё нет аналогов в популярных языках, поэтому при изучении блоков сложно опираться на прошлый опыт. К счастью, их не так сложно понять, особенно если у вас есть опыт работы с лямбда-функциями (анонимными функциями). Начнём с примера:</p>
2 <p>Всего три строчки, но очень много новых смыслов. Если говорить в общем, то здесь вызывается метод times(), который принимает на вход блок кода и вызывает его пять раз.</p>
2 <p>Всего три строчки, но очень много новых смыслов. Если говорить в общем, то здесь вызывается метод times(), который принимает на вход блок кода и вызывает его пять раз.</p>
3 <p>Блок кода - это конструкция<strong>do end</strong>. Блок очень похож на функцию, которая передается в функцию times(). Но передается довольно необычным способом. Ключевое слово<strong>do</strong>начинается после того, как закрыты вызывающие скобки у метода. Блок просто отделяется пробелом от вызова самой функции.</p>
3 <p>Блок кода - это конструкция<strong>do end</strong>. Блок очень похож на функцию, которая передается в функцию times(). Но передается довольно необычным способом. Ключевое слово<strong>do</strong>начинается после того, как закрыты вызывающие скобки у метода. Блок просто отделяется пробелом от вызова самой функции.</p>
4 <p>Как это работает? Блоки в Ruby обычно передаются в функции, как особый аргумент, который идёт вне вызова функции, что видно по примеру сверху. Внутреннюю работу блоков в функциях мы рассмотрим позже, когда немного научимся использовать блоки.</p>
4 <p>Как это работает? Блоки в Ruby обычно передаются в функции, как особый аргумент, который идёт вне вызова функции, что видно по примеру сверху. Внутреннюю работу блоков в функциях мы рассмотрим позже, когда немного научимся использовать блоки.</p>
5 <p>Это довольно необычная концепция. Сама по себе она не привносит никаких новых возможностей в язык, но даёт новые визуальные возможности по оформлению кода. Именно из-за этой особенности Ruby так хорошо подходит и часто используется, как язык для построения DSL (языков предметной области). Подробнее об этом в следующих уроках.</p>
5 <p>Это довольно необычная концепция. Сама по себе она не привносит никаких новых возможностей в язык, но даёт новые визуальные возможности по оформлению кода. Именно из-за этой особенности Ruby так хорошо подходит и часто используется, как язык для построения DSL (языков предметной области). Подробнее об этом в следующих уроках.</p>
6 <p>И, наконец, сам блок. Можно представить, что внутри функции он попадает в переменную, которая вызывается, как обычная функция. Сам блок - как функция (а он является в том числе функцией), и умеет принимать параметры. Внутрь блока они попадают через конструкцию |i|, идущую сразу после<strong>do</strong>. Этот синтаксис пришел в Ruby из Smalltalk. Если параметров несколько, то они просто перечисляются через запятую |one, two|.</p>
6 <p>И, наконец, сам блок. Можно представить, что внутри функции он попадает в переменную, которая вызывается, как обычная функция. Сам блок - как функция (а он является в том числе функцией), и умеет принимать параметры. Внутрь блока они попадают через конструкцию |i|, идущую сразу после<strong>do</strong>. Этот синтаксис пришел в Ruby из Smalltalk. Если параметров несколько, то они просто перечисляются через запятую |one, two|.</p>
7 <p>Блок работает как замыкание, а значит внутри него можно использовать любые переменные, определенные снаружи и выше блока:</p>
7 <p>Блок работает как замыкание, а значит внутри него можно использовать любые переменные, определенные снаружи и выше блока:</p>
8 <p>У блоков есть альтернативный синтаксис. Пример выше можно было записать так:</p>
8 <p>У блоков есть альтернативный синтаксис. Пример выше можно было записать так:</p>
9 <p>Подобную запись используют в том случае, когда содержимое блока помещается на одну строку. Синтаксис do/end никогда не используют для однострочных блоков.</p>
9 <p>Подобную запись используют в том случае, когда содержимое блока помещается на одну строку. Синтаксис do/end никогда не используют для однострочных блоков.</p>
10 <p>Если быть до конца честными, то эти два синтаксиса работают немного по-разному. У {} приоритет выше, чем у do/end. Это важно, когда идёт вложенный вызов нескольких функций, и каждая из них умеет работать с блоками. Давайте разберём пример:</p>
10 <p>Если быть до конца честными, то эти два синтаксиса работают немного по-разному. У {} приоритет выше, чем у do/end. Это важно, когда идёт вложенный вызов нескольких функций, и каждая из них умеет работать с блоками. Давайте разберём пример:</p>
11 <p>Однострочный вариант блока будет относиться к самой правой функции. При полной форме do ... end блок относится к самой первой функции</p>
11 <p>Однострочный вариант блока будет относиться к самой правой функции. При полной форме do ... end блок относится к самой первой функции</p>
12 <p>С помощью скобок можно определить, к какой функции блок будет относиться:</p>
12 <p>С помощью скобок можно определить, к какой функции блок будет относиться:</p>
13 <p>Не переживайте, если прямо сейчас блоки вам непонятны. Для их осознания нужно время и практика. В Ruby они повсеместно, поэтому понимание работы с блоками приходит быстро. Буквально в следующем модуле они будут уже везде.</p>
13 <p>Не переживайте, если прямо сейчас блоки вам непонятны. Для их осознания нужно время и практика. В Ruby они повсеместно, поэтому понимание работы с блоками приходит быстро. Буквально в следующем модуле они будут уже везде.</p>