Это подробное руководство по основам языка Zig, включающее примеры программ, которые демонстрируют различные концепции программирования на Zig.
Каждая программа на Zig начинается с функции main
:
const std = @import("std");
pub fn main() !void {
std.debug.print("Hello, World!\n", .{});
}
Основные типы данных в Zig:
i32
— целые числа (32 бита)f32
— числа с плавающей запятой (32 бита)char
— одиночные символы[]const u8
— строкиПример использования арифметических операций в Zig:
const std = @import("std");
pub fn main() !void {
const a = 10;
const b = 20;
const sum = a + b;
const diff = b - a;
const prod = a * b;
const div = b / a;
const mod = b % a;
std.debug.print("Sum: {}\n", .{sum});
std.debug.print("Difference: {}\n", .{diff});
std.debug.print("Product: {}\n", .{prod});
std.debug.print("Division: {}\n", .{div});
std.debug.print("Modulus: {}\n", .{mod});
}
Ввод и вывод данных с использованием std.io
:
const std = @import("std");
pub fn main() !void {
const stdin = std.io.stdin().reader();
const stdout = std.io.stdout().writer();
try stdout.print("Enter an integer: ");
var num: i32 = undefined;
try stdin.readInt(&num);
try stdout.print("You entered: {}\n", .{num});
}
Пример использования оператора if
:
const std = @import("std");
pub fn main() !void {
const stdin = std.io.stdin().reader();
const stdout = std.io.stdout().writer();
try stdout.print("Enter an integer: ");
var num: i32 = undefined;
try stdin.readInt(&num);
if (num > 0) {
try stdout.print("The number is positive.\n", .{});
} else if (num < 0) {
try stdout.print("The number is negative.\n", .{});
} else {
try stdout.print("The number is zero.\n", .{});
}
}
Пример цикла for
:
const std = @import("std");
pub fn main() !void {
for (0..5) |i| {
std.debug.print("i = {}\n", .{i});
}
}
Пример работы с массивами:
const std = @import("std");
pub fn main() !void {
const arr = [_]i32{1, 2, 3, 4, 5};
for (arr) |item, i| {
std.debug.print("arr[{}] = {}\n", .{i, item});
}
}
Пример создания и использования функции:
const std = @import("std");
fn greet() void {
std.debug.print("Hello from the function!\n", .{});
}
pub fn main() !void {
greet();
}
В Zig нет классов как таковых, но можно использовать структуры:
const std = @import("std");
const Rectangle = struct {
width: f64,
height: f64,
pub fn area(self: Rectangle) f64 {
return self.width * self.height;
},
pub fn display(self: Rectangle) void {
std.debug.print("Width: {}, Height: {}, Area: {}\n", .{self.width, self.height, self.area()});
}
};
pub fn main() !void {
var rect = Rectangle{ .width = 5.0, .height = 3.0 };
rect.display();
}
В Zig нет классического наследования, но можно использовать композицию:
const std = @import("std");
const Animal = struct {
pub fn speak(self: Animal) void {
std.debug.print("Animal makes a sound.\n", .{});
}
};
const Dog = struct {
animal: Animal,
pub fn speak(self: Dog) void {
std.debug.print("Dog barks.\n", .{});
}
};
pub fn main() !void {
var my_dog = Dog{ .animal = Animal{} };
my_dog.speak();
}
Пример работы с указателями:
const std = @import("std");
pub fn main() !void {
var num: i32 = 10;
var ptr = #
std.debug.print("Value of num: {}\n", .{num});
std.debug.print("Value via pointer: {}\n", .{ptr.*});
ptr.* = 20;
std.debug.print("New value of num: {}\n", .{num});
}
Пример динамического выделения и освобождения памяти:
const std = @import("std");
pub fn main() !void {
var allocator = std.heap.page_allocator;
var ptr = try allocator.create(i32);
ptr.* = 10;
std.debug.print("Value: {}\n", .{ptr.*});
allocator.destroy(ptr);
}
Пример работы с файлами в Zig:
const std = @import("std");
pub fn main() !void {
const allocator = std.heap.page_allocator;
const out_file = try std.fs.cwd().createFile("example.txt", .{});
try out_file.writer().print("Hello, file!\n", .{});
const in_file = try std.fs.cwd().openFile("example.txt", .{});
const file_content = try in_file.readToEndAlloc(allocator);
std.debug.print("{}\n", .{file_content});
}