Menu
Coddy logo textTech

Proc и лямбды

Часть раздела Логика и управление потоком путешествия по Ruby на Coddy — урок 19 из 56.

Блок не является объектом, вы не можете сохранить его в переменной. Когда вам нужен фрагмент кода, который можно передавать, сохранять и вызывать позже, вы оборачиваете его в Proc или lambda.

Объект Proc создается с помощью Proc.new или ключевого слова proc. Вызывайте его с помощью .call:

double = proc { |n| n * 2 }
puts double.call(5)   # 10
puts double.call(7)   # 14

Лямбда похожа, но более строга: она проверяет, что вы передаете правильное количество аргументов. Стрелочная форма -> является общепринятым написанием:

square = ->(n) { n * n }
puts square.call(4)   # 16
puts square.(4)       # 16  (сокращение для .call)

Оба могут быть переданы в метод, который ожидает блок, путем добавления префикса &:

[1, 2, 3].map(&double)   # [2, 4, 6]
[1, 2, 3].map(&square)   # [1, 4, 9]

Используйте lambda, когда вам нужна более строгая проверка аргументов; используйте Proc, когда вам нужно более легкое и снисходительное поведение.

challenge icon

Задание

Легко

Создайте лямбда-выражение с именем tripler, которое принимает одно число и возвращает его, умноженное на 3.

Затем прочитайте список целых чисел, разделенных запятыми, и выведите на отдельных строках:

  1. Результат вызова tripler.call(10)
  2. Входные числа, увеличенные втрое (используйте map(&tripler)) и объединенные через ,

Для входных данных 1,2,3 вывод будет следующим:

30
3, 6, 9

Шпаргалка

Proc – многоразовый блок, хранящийся в переменной:

double = proc { |n| n * 2 }
double.call(5)   # 10

Lambda – более строгая проверка аргументов, синтаксис стрелки:

square = ->(n) { n * n }
square.call(4)   # 16
square.(4)       # 16 (сокращенная запись)

Передача Proc/lambda в метод, ожидающий блок, с помощью &:

[1, 2, 3].map(&double)   # [2, 4, 6]

Попробуйте сами

# TODO: определить `tripler` как lambda

numbers = gets.chomp.split(",").map(&:to_i)

# TODO: строка 1, вывести tripler.call(10)
# TODO: строка 2, применить map к numbers с &tripler, объединить через ", "
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Логика и управление потоком