Procs
Повторно используемые объекты блоков
«Procs» — бесплатный урок Ruby Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Ruby Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Ruby Academy содержит 4 уроков всего.
Повторно используемые объекты-блоки
Блок сам по себе не является объектом, поэтому его нельзя сохранить в переменной. Proc оборачивает блок в настоящий объект, который можно сохранить, передать дальше и вызвать позже.
greeter = Proc.new { puts "Hello!" }
greeter.call
greeter.callСоздание Proc
Есть два распространённых способа создать Proc: Proc.new { ... } и более короткий метод Kernel proc { ... }. Оба способа создают объект одного и того же типа.
double = proc { |x| x * 2 }
p double.call(5)Вызов Proc
Вызвать Proc можно несколькими способами: .call, .() и с помощью сокращённой записи в квадратных скобках [ ]. Они эквивалентны.
square = proc { |x| x * x }
puts square.call(4)
puts square.(4)
puts square[4]Proc принимает аргументы
Proc принимает параметры так же, как блоки: их объявляют между вертикальными чертами.
add = proc { |a, b| a + b }
puts add.call(3, 7)Хранение Proc в массивах
Поскольку Proc — это объекты, можно хранить набор вариантов поведения и выполнять их по очереди.
ops = [proc { |x| x + 1 }, proc { |x| x * 2 }]
result = 5
ops.each { |op| result = op.call(result) }
puts resultПередача Proc как блока
Добавьте перед Proc префикс &, чтобы передать его методу, ожидающему блок. Ruby снова преобразует его в форму блока.
printer = proc { |n| puts "Item: #{n}" }
[1, 2, 3].each(&printer)Сохранение блоков как Proc
Работает и обратное преобразование: &block в сигнатуре метода сохраняет переданный блок как Proc, который можно хранить.
def make_handler(&block)
block
end
h = make_handler { |msg| puts "Got: #{msg}" }
h.call("ping")Proc снисходительно относится к количеству аргументов
Важная особенность: Proc не сообщает об ошибке при неправильном количестве аргументов. Пропущенные аргументы становятся равны nil, а лишние игнорируются.
p1 = proc { |a, b| puts "a=#{a.inspect} b=#{b.inspect}" }
p1.call(1)
p1.call(1, 2, 3)Proc и return
return внутри Proc возвращает управление из окружающего метода, а не только из Proc. Это может привести к неожиданностям, поэтому будьте внимательны.
def demo
p = proc { return 10 }
p.call
20 # never reached
end
puts demoProc сохраняет окружающий контекст
Proc запоминает переменные из области видимости, в которой он был определён. Благодаря этому он является замыканием — эту тему мы подробнее рассмотрим позже.
factor = 3
times_factor = proc { |n| n * factor }
puts times_factor.call(10)Собираем всё вместе
Proc превращает блоки в первоклассные объекты:
- Создавайте их с помощью
proc { }илиProc.new. - Запускайте с помощью
.call,.()или[ ]. - Передавайте методам с помощью
&. - Они снисходительно относятся к количеству аргументов и используют
returnна уровне метода.
pipeline = [proc { |s| s.upcase }, proc { |s| s + "!" }]
text = "hello"
pipeline.each { |step| text = step.call(text) }
puts textБыстрая проверка
Проверьте, насколько хорошо Вы поняли Proc.
Повторение
Вы узнали о Proc:
- Proc — это блок, обёрнутый в объект.
- Создавайте его с помощью
proc/Proc.new, а запускайте с помощью.call. - Передавайте его методам с помощью
&. - Proc допускает несоответствие количества аргументов и использует
returnна уровне метода.
shout = proc { |word| puts word.upcase }
shout.call("ruby")Часто задаваемые вопросы
Урок «Procs» бесплатный?
Да — полный текст урока «Procs» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Ruby Academy, подпишись на CoddyKit PRO. Курс Ruby Academy содержит 4 уроков всего.
Чему я научусь в уроке «Procs»?
Повторно используемые объекты блоков Ты практикуешь Ruby Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Ruby Academy?
Предыдущий опыт не требуется. Ruby Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «Procs»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Ruby Academy?
Да. Каждый урок Ruby Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.