Блоки
За время прохождения курса мы научились писать методы не привязанные к объекту (функции), методы объекта, но что если нам нужно получать от пользователя какое-то действие дополнительно ? Например наш метод выполняет свою работу, но на каком-то этапе мы хотим дать пользователю возможность повлиять на работу программы ?
Блок - это анонимная функция, которая может быть передана в другую функцию в качестве аргумента, и выполнена внутри тела функции. Блоки могут быть записаны с помощью фигурных скобок {}
или do..end
. Вот несколько примеров встроенных методов у массива, которые принимают блоки:
Эти два примера идентичны и выполняют то же самое действие: выводят на экран все элементы массива [1,2,3]
.
Как использовать блоки в Ruby?
Для работы с блоками Ruby предоставляет ключевое слово yield, которое вызывает переданный блок. Вот пример:
Нужно понимать, что блок кода работает точно так же как и обычные методы. Последняя строчка выполнения блока возвращает результат, который может быть использован внутри метода, принимающего этот блок кода
Как передать параметры в блок?
Вы можете передавать параметры в блок, используя конструкцию | |
при объявлении блока:
Представляйте каждый раз, что блок кода это возможность создать метод внутр идругого метода, тогда понимать как это работает будет проще.
Изучите наиболее часто встречющиеся методы у встроенных классов, которые принимают блок кода (примеры использования можете посмотреть в официальной документации):
Массивы (
Array
):each
- выполняет блок кода для каждого элемента массива.map
- создает новый массив, когда блок кода применяется к каждому элементу исходного массива.select
- возвращает только элементы, для которых выполнен условный блок кода.reject
возвращает элементы, для которых условный блок кода не выполнялся.group_by
- группирует элементы массива в хэш, используя результат выполнения блока кода в качестве ключа.inject
- сворачивает элементы массива, используя блок кода и начальное значение.
Хэши (
Hash
):each
- выполняет блок кода для каждой пары «ключ-значение» в хэше.map
- создает новый хэш, когда блок кода применяется к каждой паре «ключ-значение» исходного хэша.select
- возвращает хэш, содержащий только пары «ключ-значение», для которых выполнен условный блок кода.reject
- возвращает хэш, содержащий только пары «ключ-значение», для которых условный блок кода не выполнялся.group_by
- группирует пары «ключ-значение» в хэш, используя результат выполнения блока кода в качестве ключа.
Числа (
Numeric
):times
- выполняет блок кода указанное число раз.upto
- выполняет блок кода для каждого целого числа, начиная с текущего и заканчивая указанным.downto
- выполняет блок кода для каждого целого числа, начиная с текущего и заканчивая указанным в обратном порядке.
Строки (
String
):each_line
- выполняет блок кода для каждой строки, разделенной символом новой строки.gsub
- заменяет вхождения подстрок (Да, этот метод может еще и принимать блок кода)
Задание employees
Создайте классы компании Company
и сотрудника Employee
Класс компании состоит из названия и списка сотрудников.
Класс сотрудника состоит из ег оимени и отдела в котором он работает
Кроме этого у вас есть список компаний с их сотруниками
Вам необходимо:
Получить всех работников их этих компаний в виде отдельного массива
Отфильтровать работников, чье имя начинается с J
Сгруппировать полученную выборку в хэш таблицу по названию отдела в котором они работают
Рекомендации:
Задание подразумевает выполнение с помощью методов-блоков. Для поиска нужного метода воспользуйтесь официальной документацией по Enumerable
zip_action
Напишите функцию zip(arr1, arr2)
, которая принимает в аргументах строковые массивы, а также блок кода, который выполняется для всех значений массива, длина строк которых одинаковая. Пример использования:
Last updated