Os ifs de Zig são meio esquisitos por um bom motivo

zig.webp

Recentemente descobri uma particularidade interessante da linguagem Zig, que é a “extração de valores”, coisa que inicialmente eu julgava feia e esquisita mas agora consigo entender que há um bom motivo por trás da coisa toda.

Quando você extrai um valor em um if, como no exemplo abaixo, você consegue transformar um tipo opcional (que começa com ?, ou seja, que pode ser NULL) em um tipo não-opcional (que não pode ser NULL).

fn doAThing(optional_foo: ?*Foo) {
    // do some stuff
    if (optional_foo) |foo| {
        doSomethingWithFoo(foo);
    }
    // do some stuff
}

Repare que, do jeito que o if acima foi escrito, a função doSomethingWithFoo pode ser definida como recebendo Foo ao invés de ?Foo (repare, inclusive, que foo não é exatamente a mesma coisa que optional_foo). E isso faz uma diferença enorme tanto para o programador (que não precisa ficar tratando casos especiais quando o contexto realmente não exige) quanto para o compilador, que tem mais informações disponíveis para efetuar as devidas otimizações.


Este artigo foi escrito originalmente em 17/02/2021.