Menu

If/Else no Zero: ramificação condicional explicada

Como if e else funcionam em Zero: condições booleanas, corpos de cada ramo, a ausência de coerção de truthiness e como condicionais convivem com match para ramificações mais ricas.

Esta página tem editores executáveis — edite, execute e veja a saída na hora.

O básico

if em Zero se parece em linhas gerais com if de qualquer outra linguagem da família C, com uma restrição notável: a condição precisa ser um bool.

A condição value == 42 é um bool porque == entre dois i32 retorna um bool. Os dois braços contêm cada um um bloco de instruções. Qualquer braço pode ser meio que omitido — o else é opcional — mas quando os dois estão presentes, ambos têm que ser blocos { ... }.

A exigência de bool

Algumas linguagens deixam você escrever if value { ... } e tratam 0, "" ou null como falsy. Zero não. A condição precisa ser um bool de verdade.

let count = 0
if count {              // erro de compilação: esperava bool, recebeu i32
    // ...
}

if count == 0 {         // OK
    check world.out.write("nothing to do\n")
}

A razão é a mesma que perpassa o resto da linguagem: explícito vence implícito. Um agente lendo a segunda forma sabe exatamente o que está sendo checado. A primeira forma deixa as regras de truthiness implícitas e elas variam entre linguagens — Zero opta por ficar fora.

Else e else-if

A cláusula else roda quando a condição é falsa:

Encadeie condições com else if:

if value < 0 {
    check world.out.write("negative\n")
} else if value == 0 {
    check world.out.write("zero\n")
} else {
    check world.out.write("positive\n")
}

else if é só else { if ... } com as chaves omitidas — mesma semântica, menos indentação. O else final é opcional.

De onde vem a condição

A condição pode ser qualquer coisa que avalia para bool:

  • Uma ligação bool: if ok { ... }.
  • Uma comparação: if value == 42 { ... }, if x < y { ... }.
  • Uma combinação lógica: if a && b { ... }, if pair.left == 1_u8 && pair.right == 2_u8 { ... }.
  • Uma chamada de função que retorna bool: if isReady(world) { ... }.

Um trecho real dos exemplos da linguagem:

let pair: BytePair = Pair { left: 1_u8, right: 2_u8 }
if pair.left == 1_u8 && pair.right == 2_u8 {
    check world.out.write("type alias ok\n")
} else {
    check world.out.write("type alias broke\n")
}

&& faz curto-circuito como você esperaria — se o lado esquerdo é false, o direito não é avaliado. O mesmo vale para ||.

Quando usar match no lugar

Cadeias de if/else if são boas para decisões binárias ou de três vias, especialmente quando as condições não compartilham estrutura. Mas quando você está ramificando sobre as variantes de um tipo soma — um choice ou enummatch é a ferramenta certa.

Compare:

// match — exaustivo, verificado pelo compilador
match result {
    .ok  => value   { check world.out.write("ok\n") }
    .err => message { check world.out.write("err\n") }
}

vs.

// if/else sobre um tipo soma — verboso e mais fácil de errar
if result.isOk() {
    let value = result.unwrap()
    check world.out.write("ok\n")
} else {
    check world.out.write("err\n")
}

A forma com match torna a análise de variantes explícita e o compilador reclama se uma variante for adicionada depois e você esquecer de tratar. A forma if deixa silenciosamente qualquer coisa que não seja ok cair para o ramo else, inclusive variantes novinhas em que você nunca pensou.

Regra de bolso: if para booleanos, match para variantes.

Notas de estilo

Algumas convenções pequenas que tornam o código mais fácil de ler tanto para humanos quanto para agentes:

  • Sempre coloque chaves no corpo. Mesmo um corpo de uma linha vai em { ... }. Não há forma de uma só instrução sem chaves. Isso é proposital — mantém a indentação confiável e remove uma fonte comum de bugs na família C.
  • Coloque o ramo mais comum primeiro. Leitores (e agentes) leem de cima para baixo.
  • Prefira condições positivas quando forem igualmente claras. if isReady é mais fácil de seguir do que if !notReady, tudo mais sendo igual.

A seguir: laços while

Condicionais decidem o que fazer; laços decidem quantas vezes fazer. A próxima documentação cobre os laços while do Zero, a construção de laço da fase inicial da linguagem.

Perguntas frequentes

Como instruções if funcionam em Zero?

Use if condição { ... } com uma cláusula opcional else { ... }. A condição precisa ser um bool — Zero não converte inteiros, strings ou outros valores para booleano. Exemplo: if value == 42 { check world.out.write("yes\n") } else { check world.out.write("no\n") }.

Zero tem operador ternário?

Zero mantém a superfície pequena deliberadamente e usa blocos if / else em vez de um ternário separado condição ? a : b. Os exemplos oficiais favorecem ramos explícitos mesmo para casos curtos. Se sua linguagem suporta if-como-expressão, espere que Zero vá nessa direção em vez de introduzir uma segunda sintaxe.

Você pode encadear if/else if em Zero?

Sim. Encadeie condições escrevendo else if entre ramos: if a { ... } else if b { ... } else { ... }. Para ramificação mais elaborada sobre um choice ou enum, use match — é mais exaustivo e o compilador verifica se você tratou cada variante.

Por que Zero não converte valores para bool?

A filosofia de design do Zero é 'tudo é explícito'. Truthiness implícito — tratar 0, "" ou null como falso — é fonte frequente de bugs e difícil de um agente raciocinar com precisão. Exigir um bool de verdade torna a decisão de ramificação visível no código e mais fácil de verificar mecanicamente.

Quando usar match em vez de if/else?

Use match quando estiver ramificando sobre as variantes de um choice ou enum. O compilador pode verificar que você cobriu todos os casos, o que cadeias de if/else if não conseguem. Mantenha if/else para predicados booleanos simples — checagens de igualdade, comparações e ramos curtos de duas vias.

Coddy programming languages illustration

Aprenda a programar com o Coddy

COMEÇAR