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 enum — match é 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 queif !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.