Menu
Coddy logo textTech

Proc и Lambda

Часть раздела Логика и управление потоком путешествия по 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. Входные числа, умноженные на 3 (используй 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, join с ", "
quiz iconПроверьте себя

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

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

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