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

Объект lambda похож, но работает строже: он проверяет, чтобы вы передавали точное количество аргументов. Форма со стрелкой -> — это общепринятая запись:

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

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

# TODO: определите `tripler` как лямбду

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

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

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

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

Потренируйтесь самостоятельно: Онлайн-компилятор Ruby