Variaveis são snake_case e fuções são camelCase
(const|var) identifier[: type] = value
const
- indica que o identifier
é uma constante que armazena um valor imutávelvar
- indica que o identifier
é uma variavel que armazena um valor mutáveltype
- é uma anotação do tipo do identifier
que pode ser omitido se o value
pode ser inferidoconst constant: i32 = 5; // signed 32-bit constant
var variable: u32 = 5000; // unsigned 32-bit variable
// @as performs an explicit type coercion
const inferred_constant = @as(i32, 5);
var inferred_variable = @as(u32, 5000);
Array literals podem ser omitidos com o uso de _
:
const a = [5]u8{ 'h', 'e', 'l', 'l', 'o' };
const b = [_]u8{ 'w', 'o', 'r', 'l', 'd' };
Para acessar o tamanho do array:
const array = [_]u8{ 'h', 'e', 'l', 'l', 'o' };
const length = array.len; // 5
test "for" {
//character literals are equivalent to integer literals
const string = [_]u8{ 'a', 'b', 'c' };
for (string, 0..) |character, index| {
_ = character;
_ = index;
}
for (string) |character| {
_ = character;
}
for (string, 0..) |_, index| {
_ = index;
}
for (string) |_| {}
}
Todos os argumentos de funções são imutáveis.
é util para garantir que recursos sejam limpados quando não forem mais necessários (Exatamente o mesmo padrão em golang)
const expect = @import("std").testing.expect;
test "defer" {
var x: i16 = 5;
{
defer x += 2;
try expect(x == 5);
}
try expect(x == 7);
}
There are no exceptions in zig, errors are values.
const FileOpenError = error{
AccessDenied,
OutOfMemory,
FileNotFound,
};
const expect = @import("std").testing.expect;
const FileOpenError = error{
AccessDenied,
OutOfMemory,
FileNotFound,
};
const AllocationError = error{OutOfMemory};
test "coerce error from a subset to a superset" {
const err: FileOpenError = AllocationError.OutOfMemory;
try expect(err == FileOpenError.OutOfMemory);
}
test "error union" {
const maybe_error: AllocationError!u16 = 10;
const no_error = maybe_error catch 0;
try expect(@TypeOf(no_error) == u16);
try expect(no_error == 10);
}
é similar ao defer porém somente é executado quando a função retornar com um erro
var problems: u32 = 98;
fn failFnCounter() error{Oops}!void {
errdefer problems += 1;
try failingFunction();
}
test "errdefer" {
failFnCounter() catch |err| {
try expect(err == error.Oops);
try expect(problems == 99);
return;
};
}
o catch é usando no exemplo abaixo com a tecnica payload capturing
seguida de um trecho de codigo. Nesse cenario o código só é executado se
ocorrer algum erro na failingFunction
fn failingFunction() error{Oops}!void {
return error.Oops;
}
test "returning an error" {
failingFunction() catch |err| {
try expect(err == error.Oops);
return;
};
}