Ruby do Zero: Condicionais com if/elsif/else, unless e case

Capítulo 7

Tempo estimado de leitura: 6 minutos

+ Exercício

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

status

Note 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.

Continue em nosso aplicativo e ...
  • Ouça o áudio com a tela desligada
  • Ganhe Certificado após a conclusão
  • + de 5000 cursos para você explorar!
ou continue lendo abaixo...
Download App

Baixar o aplicativo

  • Defina a nota
  • Crie faixas com if/elsif
  • Garanta um else para 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

conceito

Esse 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 == 0

Use 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
end

Repare como isso evita:

def aplicar_desconto(preco, cupom)
  if !cupom.nil? && cupom != ""
    preco * 0.9
  else
    preco
  end
end

O 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

status

També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 unless quando a condição for simples e positiva (ex.: unless ativo).
  • Evite unless com else em regras complexas, porque pode confundir a leitura.
  • Evite unless com 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

limite

Assim 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

tipo

Case 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

alerta

Case 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

categoria

Use 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
end

Versã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
end

2) 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

nivel

3) 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)

limite

fetch 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

frete

Se 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"
end

Resumo de escolha rápida

SituaçãoEstrutura recomendada
Duas possibilidades (sim/não)if/else ou inline (... if cond)
Várias faixas ou alternativas encadeadasif/elsif/else
Vários cenários baseados no mesmo valorcase/when
Condição negativa simplesunless
Evitar aninhamento e falhar cedoguard clauses com return ... if

Agora responda o exercício sobre o conteúdo:

Em Ruby, qual é a melhor escolha quando você precisa tratar vários cenários baseados no mesmo valor, mantendo o código mais legível do que uma cadeia longa de elsif?

Você acertou! Parabéns, agora siga para a próxima página

Você errou! Tente novamente.

Quando há várias alternativas baseadas no mesmo valor, case/when tende a ser mais legível do que uma sequência grande de elsif. Além disso, assim como if, ele pode retornar um valor para ser atribuído.

Próximo capitúlo

Ruby do Zero: Loops e Iteração — while, until, times e each

Arrow Right Icon
Capa do Ebook gratuito Ruby do Zero: Fundamentos, Coleções, Blocos e Organização de Código
33%

Ruby do Zero: Fundamentos, Coleções, Blocos e Organização de Código

Novo curso

21 páginas

Baixe o app para ganhar Certificação grátis e ouvir os cursos em background, mesmo com a tela desligada.