Блоки

За время прохождения курса мы научились писать методы не привязанные к объекту (функции), методы объекта, но что если нам нужно получать от пользователя какое-то действие дополнительно ? Например наш метод выполняет свою работу, но на каком-то этапе мы хотим дать пользователю возможность повлиять на работу программы ?

Блок - это анонимная функция, которая может быть передана в другую функцию в качестве аргумента, и выполнена внутри тела функции. Блоки могут быть записаны с помощью фигурных скобок {} или 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

  • Сгруппировать полученную выборку в хэш таблицу по названию отдела в котором они работают

Рекомендации:

zip_action

Напишите функцию zip(arr1, arr2), которая принимает в аргументах строковые массивы, а также блок кода, который выполняется для всех значений массива, длина строк которых одинаковая. Пример использования:

Last updated