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(&:reverse) - метод<em>map</em>класса<em>Array</em>, результат - новый<em>Array</em></p>
9
<li><p>.map(&: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>