0Pricing
Ruby Academy · Урок

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 demo

Proc сохраняет окружающий контекст

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 — локальная установка не требуется.

Все уроки этого курса

  1. Повторение блоков
  2. Procs
  3. Лямбды
  4. Замыкания и область видимости
← Назад к Ruby Academy