0Pricing
Ruby Academy · Aula

Procs

Objetos de bloco reutilizáveis.

Procs é uma aula grátis de Ruby Academy no CoddyKit. Esta é a aula 2 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Ruby Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Ruby Academy inclui 4 aulas no total.

Objetos de bloco reutilizáveis

Um bloco não é um objeto por si só, portanto você não pode armazená-lo em uma variável. Um Proc envolve um bloco em um objeto real que você pode salvar, passar adiante e chamar mais tarde.

greeter = Proc.new { puts "Hello!" }
greeter.call
greeter.call

Criando Procs

Há duas formas comuns de criar um Proc: Proc.new { ... } e o método mais curto proc { ... } do Kernel. Ambos produzem o mesmo tipo de objeto.

double = proc { |x| x * 2 }
p double.call(5)

Chamando um Proc

Você pode invocar um Proc de várias formas: .call, .() e a forma abreviada com colchetes [ ]. Elas são equivalentes.

square = proc { |x| x * x }
puts square.call(4)
puts square.(4)
puts square[4]

Procs aceitam argumentos

Os Procs aceitam parâmetros assim como os blocos, declarados entre as barras verticais.

add = proc { |a, b| a + b }
puts add.call(3, 7)

Armazenando Procs em matrizes

Como os Procs são objetos, você pode manter uma coleção de comportamentos e executá-los em sequência.

ops = [proc { |x| x + 1 }, proc { |x| x * 2 }]
result = 5
ops.each { |op| result = op.call(result) }
puts result

Passando um Proc como bloco

Adicione o prefixo & a um Proc para passá-lo a um método que espera um bloco. O Ruby o converte novamente para o formato de bloco.

printer = proc { |n| puts "Item: #{n}" }
[1, 2, 3].each(&printer)

Capturando blocos como Procs

O inverso também funciona: &block na assinatura de um método captura o bloco fornecido como um Proc que você pode armazenar.

def make_handler(&block)
  block
end
h = make_handler { |msg| puts "Got: #{msg}" }
h.call("ping")

Procs são flexíveis quanto à aridade

Uma característica importante: os Procs não reclamam quando a quantidade de argumentos está incorreta. Os argumentos ausentes se tornam nil e os adicionais são ignorados.

p1 = proc { |a, b| puts "a=#{a.inspect} b=#{b.inspect}" }
p1.call(1)
p1.call(1, 2, 3)

Procs e retorno

Um return dentro de um Proc retorna do método que o envolve, não apenas do Proc. Isso pode surpreendê-lo, portanto tenha cuidado.

def demo
  p = proc { return 10 }
  p.call
  20  # never reached
end
puts demo

Procs capturam o ambiente ao redor

Um Proc se lembra das variáveis no escopo em que foi definido. Isso faz dele um fechamento, um tópico que exploraremos mais adiante.

factor = 3
times_factor = proc { |n| n * factor }
puts times_factor.call(10)

Juntando tudo

Os Procs transformam blocos em objetos de primeira classe:

  • Crie-os com proc { } ou Proc.new.
  • Execute-os com .call, .() ou [ ].
  • Passe-os aos métodos com &.
  • Eles são flexíveis quanto à aridade e usam o return no nível do método.
pipeline = [proc { |s| s.upcase }, proc { |s| s + "!" }]
text = "hello"
pipeline.each { |step| text = step.call(text) }
puts text

Verificação rápida

Teste sua compreensão sobre Procs.

Recapitulação

Você aprendeu sobre Procs:

  • Um Proc é um bloco envolvido em um objeto.
  • Crie-o com proc/Proc.new; execute-o com .call.
  • Passe-o aos métodos usando &.
  • Eles toleram diferenças de aridade e usam o return no nível do método.
shout = proc { |word| puts word.upcase }
shout.call("ruby")

Perguntas Frequentes

A aula “Procs” é grátis?

Sim — o texto completo de “Procs” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Ruby Academy, atualize para CoddyKit PRO. O curso de Ruby Academy inclui 4 aulas no total.

O que vou aprender em “Procs”?

Objetos de bloco reutilizáveis. Você pratica Ruby Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar Ruby Academy?

Nenhuma experiência prévia é necessária. Ruby Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 2 de 4.

Quanto tempo leva a aula “Procs”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de Ruby Academy?

Sim. Cada aula de Ruby Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. Revisão de blocos
  2. Procs
  3. Lambdas
  4. Closures e escopo
← Voltar para Ruby Academy