O que são condicionais em Ruby
Condicionais controlam o fluxo do programa: dependendo de uma condição ser verdadeira ou falsa, um bloco de código é executado. Em Ruby, as estruturas mais comuns são if/elsif/else, o modificador inline (condição no fim da linha), unless (negação mais legível em alguns casos) e case/when (múltiplos cenários).
Em Ruby, false e nil são considerados “falsos”. Todo o resto é “verdadeiro”, inclusive 0 e strings vazias "".
Condicionais com if/elsif/else
Estrutura básica
Use if quando você quer executar um bloco apenas se a condição for verdadeira. Use elsif para testar alternativas e else como caminho padrão.
idade = 17
if idade >= 18
status = "maior de idade"
elsif idade >= 16
status = "pode votar"
else
status = "menor de idade"
end
statusNote que o último valor avaliado pode ser atribuído a uma variável. Em Ruby, if é uma expressão (retorna um valor), não apenas um comando.
Passo a passo: classificando uma nota
Objetivo: transformar uma nota numérica em um conceito.
- Ouça o áudio com a tela desligada
- Ganhe Certificado após a conclusão
- + de 5000 cursos para você explorar!
Baixar o aplicativo
- Defina a nota
- Crie faixas com
if/elsif - Garanta um
elsepara valores fora do esperado (ou para o menor caso)
nota = 8.5
conceito = if nota >= 9
"A"
elsif nota >= 7
"B"
elsif nota >= 5
"C"
else
"D"
end
conceitoEsse formato (atribuindo o resultado do if) costuma reduzir variáveis intermediárias e deixa a regra mais explícita.
Modificadores inline (condição no fim da linha)
Quando o bloco é curto e há apenas uma ação, você pode colocar a condição no fim da linha. Isso melhora a leitura em casos simples.
admin = true
mensagem = "Acesso liberado" if admin
estoque = 0
puts "Produto indisponível" if estoque == 0Use inline quando a linha continuar fácil de ler. Se a linha ficar longa, prefira o bloco tradicional.
Inline com retorno antecipado (guard clause)
Uma técnica importante para evitar aninhamento é usar “guard clauses”: checagens no começo que interrompem o fluxo cedo, reduzindo if dentro de if.
def aplicar_desconto(preco, cupom)
return preco if cupom.nil?
return preco if cupom == ""
preco * 0.9
endRepare como isso evita:
def aplicar_desconto(preco, cupom)
if !cupom.nil? && cupom != ""
preco * 0.9
else
preco
end
endO primeiro exemplo costuma ser mais legível e fácil de manter.
Unless: negação mais clara
unless significa “a menos que”. Ele executa o bloco quando a condição é falsa. É útil quando a negação deixa a frase mais natural.
conectado = false
unless conectado
status = "offline"
end
statusTambém existe o modificador inline com unless:
senha = ""
puts "Senha obrigatória" unless senha != ""O exemplo acima é propositalmente ruim: a condição ficou confusa por causa da dupla negação. Melhor escrever de forma direta:
senha = ""
puts "Senha obrigatória" if senha == ""Recomendação de estilo para unless
- Use
unlessquando a condição for simples e positiva (ex.:unless ativo). - Evite
unlesscomelseem regras complexas, porque pode confundir a leitura. - Evite
unlesscom condições negadas (ex.:unless !ativo), pois vira dupla negação.
Case/when: múltiplos cenários com mais legibilidade
Quando você tem várias alternativas baseadas no mesmo valor, case tende a ficar mais limpo do que uma cadeia longa de elsif.
Case com valores exatos
plano = "pro"
limite = case plano
when "free"
5
when "basic"
20
when "pro"
100
else
0
end
limiteAssim como if, case também retorna um valor, então é comum atribuir o resultado.
Case com múltiplos valores no mesmo when
dia = "sab"
tipo = case dia
when "seg", "ter", "qua", "qui", "sex"
"dia útil"
when "sab", "dom"
"fim de semana"
else
"desconhecido"
end
tipoCase com intervalos (faixas)
Para classificação por faixas, case pode usar intervalos. Um padrão comum é case valor e when 0..10, etc.
temperatura = 28
alerta = case temperatura
when -50..10
"frio"
when 11..25
"agradável"
when 26..50
"quente"
else
"fora da faixa"
end
alertaCase sem expressão (case true) para regras
Quando as condições não dependem de um único valor, você pode usar case sem expressão e testar condições em cada when. Um padrão comum é case true, que transforma cada when em uma condição booleana.
idade = 20
estudante = true
categoria = case true
when idade < 12
"infantil"
when idade < 18
"juvenil"
when estudante
"adulto estudante"
else
"adulto"
end
categoriaUse com moderação: se virar uma lista enorme de regras, considere extrair para métodos menores ou uma estrutura de dados.
Técnicas para tornar regras de decisão mais legíveis
1) Prefira guard clauses para reduzir aninhamento
Compare um estilo aninhado com guard clauses:
def pode_finalizar_compra?(itens, endereco, pagamento)
if itens.any?
if !endereco.nil?
if pagamento == "ok"
true
else
false
end
else
false
end
else
false
end
endVersão mais legível:
def pode_finalizar_compra?(itens, endereco, pagamento)
return false if itens.empty?
return false if endereco.nil?
return false unless pagamento == "ok"
true
end2) Extraia condições para variáveis com nomes claros
Quando uma condição fica grande, nomeie-a. Isso documenta a regra.
idade = 19
assinatura_ativa = true
bloqueado = false
pode_acessar = idade >= 18 && assinatura_ativa && !bloqueado
if pode_acessar
nivel = "completo"
else
nivel = "restrito"
end
nivel3) Use tabelas (hash) quando for mapeamento simples
Se você está apenas mapeando um valor para outro, um case pode ser substituído por uma tabela, reduzindo ramificações.
limites = {
"free" => 5,
"basic" => 20,
"pro" => 100
}
plano = "basic"
limite = limites.fetch(plano, 0)
limitefetch permite definir um padrão (aqui, 0) quando a chave não existe.
4) Ordene condições do mais específico para o mais geral
Em cadeias elsif ou em case true, a primeira condição que casar “vence”. Coloque regras mais específicas antes das gerais.
valor = 100
cliente_vip = true
frete = if cliente_vip
0
elsif valor >= 200
0
else
20
end
freteSe a regra “VIP tem frete grátis” é mais específica e prioritária, ela deve aparecer primeiro.
5) Evite else quando a regra já está completa
Quando você usa retornos antecipados, muitas vezes o else deixa de ser necessário.
def status_pagamento(codigo)
return "aprovado" if codigo == 0
return "pendente" if codigo == 1
return "recusado" if codigo == 2
"desconhecido"
endResumo de escolha rápida
| Situação | Estrutura recomendada |
|---|---|
| Duas possibilidades (sim/não) | if/else ou inline (... if cond) |
| Várias faixas ou alternativas encadeadas | if/elsif/else |
| Vários cenários baseados no mesmo valor | case/when |
| Condição negativa simples | unless |
| Evitar aninhamento e falhar cedo | guard clauses com return ... if |