HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-02-26
1 <p><strong>Визуально программирование в функциональном стиле выглядит как последовательный вызов методов первоначального объекта. Но в реальности это совсем не так.</strong></p>
1 <p><strong>Визуально программирование в функциональном стиле выглядит как последовательный вызов методов первоначального объекта. Но в реальности это совсем не так.</strong></p>
2 <p>Обычно программирование в Ruby в функциональном стиле выглядит так:</p>
2 <p>Обычно программирование в Ruby в функциональном стиле выглядит так:</p>
3 <p>Визуально такая запись воспринимается как последовательный вызов методов к переменной<strong>str (класс String)</strong>. Фактически, каждый последующий метод вызывается к результату предыдущего. Часто класс результата отличается от первоначального. Следовательно, изменяется и доступный набор методов.</p>
3 <p>Визуально такая запись воспринимается как последовательный вызов методов к переменной<strong>str (класс String)</strong>. Фактически, каждый последующий метод вызывается к результату предыдущего. Часто класс результата отличается от первоначального. Следовательно, изменяется и доступный набор методов.</p>
4 <p>Разберем приведенный выше пример:</p>
4 <p>Разберем приведенный выше пример:</p>
5 <ul><li><p>str.split(" ") - вызываем метод<em>split</em>для класса<em>String</em>, результат - класс<em>Array</em></p>
5 <ul><li><p>str.split(" ") - вызываем метод<em>split</em>для класса<em>String</em>, результат - класс<em>Array</em></p>
6 </li>
6 </li>
7 <li><p>.select{|el| !el.start_with?("f")} - метод<em>select</em>класса<em>Array</em>, результат - новый<em>Array</em></p>
7 <li><p>.select{|el| !el.start_with?("f")} - метод<em>select</em>класса<em>Array</em>, результат - новый<em>Array</em></p>
8 </li>
8 </li>
9 <li><p>.map(&amp;:reverse) - метод<em>map</em>класса<em>Array</em>, результат - новый<em>Array</em></p>
9 <li><p>.map(&amp;:reverse) - метод<em>map</em>класса<em>Array</em>, результат - новый<em>Array</em></p>
10 </li>
10 </li>
11 <li><p>.join(" ") - метод<em>join</em>класса<em>Array</em>, результат - новая строка (<em>String</em>)</p>
11 <li><p>.join(" ") - метод<em>join</em>класса<em>Array</em>, результат - новая строка (<em>String</em>)</p>
12 </li>
12 </li>
13 </ul><p>В начале и конце - строки (<em>String</em>), но на промежуточных шагах мы работали с массивами (<em>Array</em>) и вызывали методы доступные массивам. Описание методов<em>map</em>и<em>select</em>в документации нужно смотреть для массивов, у строк таких методов нет. Интересно еще, что вызов методов<em>map</em>и<em>select</em>без блока возвращает не массив, а объект класса<em>Enumerator</em>. Он обладает урезанным набором методов по сравнению с массивами.</p>
13 </ul><p>В начале и конце - строки (<em>String</em>), но на промежуточных шагах мы работали с массивами (<em>Array</em>) и вызывали методы доступные массивам. Описание методов<em>map</em>и<em>select</em>в документации нужно смотреть для массивов, у строк таких методов нет. Интересно еще, что вызов методов<em>map</em>и<em>select</em>без блока возвращает не массив, а объект класса<em>Enumerator</em>. Он обладает урезанным набором методов по сравнению с массивами.</p>
14 <p><em>P.S. Эта заметка написана новичком и для новичков. Понимаю, что для опытных программистов это является очевидным фактом.</em></p>
14 <p><em>P.S. Эта заметка написана новичком и для новичков. Понимаю, что для опытных программистов это является очевидным фактом.</em></p>