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) # 14lambda похожа, но строже: она проверяет, что ты передаёшь правильное количество аргументов. Стрелочная форма -> — это распространённый синтаксис:
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, если нужно более мягкое и снисходительное поведение.
Задание
ЛегкоСоздай лямбда-выражение с именем tripler, которое принимает одно число и возвращает его, умноженное на 3.
Затем прочитай список целых чисел, разделённых запятыми, и выведи в отдельных строках:
- Результат вызова
tripler.call(10) - Входные числа, умноженные на 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 с ", "
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и управление потоком
1Строки: подробный разбор
Обзор методов строкИнтерполяция строкПеребор строкРазделение и объединениеПовторение — String Weaver4Блоки, Proc и Lambda
Что такое блок?do..end и фигурные скобкиКлючевое слово yieldПараметры блокаProc и LambdaПовторение — пользовательский итератор7Хэши, часть 2
Hash.new со значениями по умолчаниюПеребор хэшейВложенные хэшиОбъединение и преобразованиеПовторение — счётчик частот10Проект — Учёт студентов
Обзор проектаДобавление студента2Диапазоны
Что такое диапазон?Методы диапазоновДиапазоны в Case / WhenПовторение — практика с диапазонами5Мощь Enumerable
Select и RejectЦепочка вызовов mapReduce / Injectcount, all?, any?, none?group_by и partitionsort_by, min_by, max_byПовторение — конвейер данных3Двумерные массивы
Основы двумерных массивовДоступ к элементам двумерного массиваПеребор двумерных массивовРаспространённые шаблоны для двумерных массивовПовторение — операции с матрицами6Проект — Менеджер библиотеки
Обзор проектаДобавление книгиПотренируйтесь самостоятельно: Онлайн-компилятор Ruby