Os ifs de Zig são meio esquisitos por um bom motivo
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.
Originally published at https://website.cleber.solutions on February 17, 2021.