пятница, 14 сентября 2007 г.

Ruby's blocks and iterators

Что такое блок в Руби? Это кусок кода, огранченный скобками {} или do end. Блок ассоциируется с методом и является чем-то, что похоже на колбек. Обращение к этому коду происходит через вызов yield:

При вызове метода blockCall будет дважды выведено "I'm block".

В блок можно передавать параметры:

При выполнении этого метода, будет выведено
"I'm block 1"
"I'm block 2"

Какая же ценность этих блоков? Механиз блоков применяется для итераторов. Итератор в Руби - это всего лишь функция, которая ассоциируется с некоторым блоком и внутри которой есть yield. Не нужны дополнительные классы как в С++. Например, итератор Array#each просто перебирает все элементы массива. Для того, что бы вывести списов элементов, можно просто написать:

Как пример можно рассмотреть так же метод Array#find:

Теперь, если мы хотим найти элемента массива, квадрат которого больше 30:

Еще одно удобное применение блоков - выполнение транзакций. Код транзакиции помещается в блок, конект к источнику данных и дисконект выполняется в функции:

Пользователя этого класса не заботит открытие и закрытие файла, его интересует только сама чтение файла (запись или другое действие с файлом).

Есть еще один способ использовать блок с методом - если последний параметр метода содержит префикс &, то ассоциированный блок конвертируется в объект Proc и передается как параметр метода:

Комментариев нет: