Перейти к основному содержимому

Простые приложения на Zig

Разработчику Архитектору

Простые приложения на Zig

Zig — язык системного уровня без скрытого allocator: память явная, std богата. Сборка: zig build / zig run file.zig.

Как запускать примеры из главы

  1. Команда: zig run имя.zig
  2. Проверка: zig version (0.11+).

Генератор паролей

Как запустить

  • Файл: password.zig
  • Команда: zig run password.zig
const std = @import("std");
const random = std.crypto.random;

pub fn generatePassword(allocator: std.mem.Allocator, len: usize) ![]u8 {
const charset = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
var buf = try allocator.alloc(u8, len);
for (buf) |*c| {
c.* = charset[random.intRangeAtMost(usize, 0, charset.len - 1)];
}
return buf;
}

pub fn main() !void {
var gpa = std.heap.GeneralPurposeAllocator(.{}){};
defer _ = gpa.deinit();
const pass = try generatePassword(gpa.allocator(), 16);
defer gpa.allocator().free(pass);
std.debug.print("{s}\n", .{pass});
}

Чтение и сортировка файла

const std = @import("std");

pub fn sortFile(allocator: std.mem.Allocator, path: []const u8) !void {
const data = try std.fs.cwd().readFileAlloc(allocator, path, 1024 * 1024);
defer allocator.free(data);
var list = std.ArrayList([]const u8).init(allocator);
defer list.deinit();
var it = std.mem.splitScalar(u8, data, '\n');
while (it.next()) |line| {
const t = std.mem.trim(u8, line, " \r");
if (t.len > 0) try list.append(t);
}
std.sort.pdq([]const u8, list.items, {}, struct {
fn lessThan(_: void, a: []const u8, b: []const u8) bool {
return std.mem.order(a, b) == .lt;
}
}.lessThan);
}

Характерный пример — try и явный allocator

const std = @import("std");

pub fn parsePort(s: []const u8) !u16 {
const value = try std.fmt.parseInt(u16, s, 10);
if (value == 0) return error.InvalidPort;
return value;
}

Ошибки — значения типа error, без исключений.


См. также: C++ — простые приложения

См. также

Другие статьи этого же раздела в боковом меню (как на странице «О разделе»).