Linguagem Ruby: Blocos, Procs, Lambdas e Metaprogramação
Instruções Gerais:
- Resolva as atividades em ordem progressiva de maturidade.
- Cada nível adiciona requisitos técnicos, tratamento de erros e casos de borda reais.
- Consulte o gabarito comentado ao final de cada questão para autoavaliação.
🎯 Nível 1: Fundamentos
Problema 16.1 — Classes, Atributos (attr_accessor) e Métodos em Ruby
Contexto: Classes, Atributos (attr_accessor) e Métodos em Ruby no contexto de Linguagem Ruby: Blocos, Procs, Lambdas e Metaprogramação.
Requisitos de Execução:
- Criar classe
Produtocomattr_readere método de cálculo de desconto.
Resultado Esperado
Classe Ruby instanciada de forma elegante.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_16_1_SeuNome - Envie na tarefa:
Atividade Cap 16 - Linguagem Ruby: Blocos, Procs, Lambdas e Metaprogramação
🔑 Gabarito de Código & Solução Comentada
class Produto
attr_reader :nome, :preco
def initialize(nome, preco)
@nome = nome
@preco = preco
end
def com_desconto(percentual)
@preco * (1.0 - percentual / 100.0)
end
end
p = Produto.new("Monitor 4K", 2000.0)
puts "Preco com desconto: R$ #{p.com_desconto(10)}"
🔍 Nível 2: Prática
Problema 16.2 — Blocos, Iteradores e Enumerable (map, select, reduce)
Contexto: Blocos, Iteradores e Enumerable (map, select, reduce) no contexto de Linguagem Ruby: Blocos, Procs, Lambdas e Metaprogramação.
Requisitos de Execução:
- Processar coleção de vendas somando o total e filtrando maiores pedidos com métodos do
Enumerable.
Resultado Esperado
Processamento funcional fluído com blocos Ruby.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_16_2_SeuNome - Envie na tarefa:
Atividade Cap 16 - Linguagem Ruby: Blocos, Procs, Lambdas e Metaprogramação
🔑 Gabarito de Código & Solução Comentada
vendas = [150.0, 45.0, 320.0, 80.0]
grandes_vendas = vendas.select { |v| v > 100.0 }
total = grandes_vendas.reduce(0, :+)
puts "Grandes vendas: #{grandes_vendas}"
puts "Total acumulado: R$ #{total}"
⚡ Nível 3: Integração
Problema 16.3 — Diferença entre Procs e Lambdas em Ruby
Contexto: Diferença entre Procs e Lambdas em Ruby no contexto de Linguagem Ruby: Blocos, Procs, Lambdas e Metaprogramação.
Requisitos de Execução:
- Demonstrar como
lambdaverifica rigorosamente o número de argumentos e trata o comandoreturn.
Resultado Esperado
Comportamento de Procs e Lambdas demonstrado com clareza.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_16_3_SeuNome - Envie na tarefa:
Atividade Cap 16 - Linguagem Ruby: Blocos, Procs, Lambdas e Metaprogramação
🔑 Gabarito de Código & Solução Comentada
minha_lambda = ->(x, y) { x + y }
meu_proc = Proc.new { |x, y| x.to_i + y.to_i }
res_lambda = minha_lambda.call(10, 20)
res_proc = meu_proc.call(10)
puts "Resultado Lambda: #{res_lambda}"
puts "Resultado Proc flexivel: #{res_proc}"
puts "Status: 200 OK"
🏆 Nível 4: Desafio Corporativo
Problema 16.4 — Metaprogramação com define_method e method_missing
Contexto: Metaprogramação com define_method e method_missing no contexto de Linguagem Ruby: Blocos, Procs, Lambdas e Metaprogramação.
Requisitos de Execução:
- Criar métodos dinamicamente com
define_methodpara atributos de configuração corporativa.
Resultado Esperado
Metaprogramação corporativa gerando métodos dinâmicos com elegância.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_16_4_SeuNome - Envie na tarefa:
Atividade Cap 16 - Linguagem Ruby: Blocos, Procs, Lambdas e Metaprogramação
🔑 Gabarito de Código & Solução Comentada
class ConfiguracaoDinamica
def self.adicionar_campo(nome, valor_padrao)
define_method(nome) { valor_padrao }
end
adicionar_campo :ambiente, "producao"
adicionar_campo :versao, "2.4.0"
end
cfg = ConfiguracaoDinamica.new
puts "Ambiente: #{cfg.ambiente} | Versao: #{cfg.versao}"