Блоки
За время прохождения курса мы научились писать методы не привязанные к объекту (функции), методы объекта, но что если нам нужно получать от пользователя какое-то действие дополнительно ? Например наш метод выполняет свою работу, но на каком-то этапе мы хотим дать пользователю возможность повлиять на работу программы ?
Блок - это анонимная функция, которая может быть передана в другую функцию в качестве аргумента, и выполнена внутри тела функции. Блоки могут быть записаны с помощью фигурных скобок {} или do..end. Вот несколько примеров встроенных методов у массива, которые принимают блоки:
# блоки с фигурными скобками {}
# x в данном случае это переменная элемента текущего цикла
[1,2,3].each { |x| puts x }
# блоки с do..end
[1,2,3].each do |x|
puts x
endЭти два примера идентичны и выполняют то же самое действие: выводят на экран все элементы массива [1,2,3].
Как использовать блоки в Ruby?
Для работы с блоками Ruby предоставляет ключевое слово yield, которое вызывает переданный блок. Вот пример:
def greet
# сначала мы напечатаем в консоль Hi
puts "Hi"
# потом выполним блок кода, который нам передал пользователь
yield
# После этого напечатается в консоль Bye
puts "Bye"
end
# Hi
# Welcome!
# Bye
greet { puts "Welcome!" }Нужно понимать, что блок кода работает точно так же как и обычные методы. Последняя строчка выполнения блока возвращает результат, который может быть использован внутри метода, принимающего этот блок кода
Как передать параметры в блок?
Вы можете передавать параметры в блок, используя конструкцию | | при объявлении блока:
Представляйте каждый раз, что блок кода это возможность создать метод внутр идругого метода, тогда понимать как это работает будет проще.
Изучите наиболее часто встречющиеся методы у встроенных классов, которые принимают блок кода (примеры использования можете посмотреть в официальной документации):
Массивы (
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