Обобщённые структуры данных
Используйте шаблон функции, возвращающей тип.
«Обобщённые структуры данных» — бесплатный урок Zig Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Zig Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Zig Academy содержит 4 уроков всего.
Обобщённые контейнеры в Zig
Чтобы структура данных работала с элементами любого типа, напишите функцию, которая принимает тип и возвращает совершенно новый тип структуры. 📦
Функция, возвращающая тип
Суть в том, что функция может иметь возвращаемый тип type. Во время компиляции она вычисляет и возвращает новый тип.
fn List(comptime T: type) type {
return struct {};
}Создание структуры внутри функции
Внутри функции определите структуру, поля которой используют параметр типа T. Каждый вызов создаёт структуру, настроенную под тип элемента.
fn Box(comptime T: type) type {
return struct { value: T };
}Присвоение имени полученному типу
Вызовите функцию, возвращающую тип, и сохраните результат в const. Теперь у вас есть конкретный тип, готовый к использованию.
const IntBox = Box(i32);Создание экземпляра
Используйте именованный тип так же, как любую структуру. Здесь мы создаём Box, содержащий целое число сорок два.
const b = IntBox{ .value = 42 };Добавление методов во внутреннюю структуру
Возвращаемая структура также может содержать методы. Они видят параметр типа, поэтому остаются полностью обобщёнными.
fn Box(comptime T: type) type {
return struct {
value: T,
fn get(self: @This()) T {
return self.value;
}
};
}Доступ к типу через @This
Внутри возвращаемой анонимной структуры нельзя обратиться к ней по имени, поэтому методы используют @This(), ссылаясь на тип окружающей структуры.
self: @This()Много типов из одного определения
Вызовите функцию с разными типами — и получите отдельные структуры. Box(i32) и Box(f64) — это разные типы, полностью проверяемые компилятором.
const FloatBox = Box(f64);На этом основана стандартная библиотека
Собственные ArrayList и HashMap в Zig построены именно так: функции принимают тип и возвращают настроенный тип контейнера.
const Ints = std.ArrayList(i32);Полностью разрешается во время компиляции
Вся эта конструкция типов создаётся во время сборки, поэтому обобщённый контейнер имеет такую же стоимость, как написанный вручную.
Передавайте распределитель памяти при расширении
Растущие контейнеры хранят поле распределителя памяти, передаваемое при инициализации, поэтому обобщённый тип явно указывает источник своей памяти.
return struct {
items: []T,
alloc: std.mem.Allocator,
};Быстрая проверка
Вы хотите создать обобщённый стек, работающий с элементами любого типа в Zig. Какой шаблон следует использовать?
Итоги
Напишите функцию, которая принимает тип и возвращает тип структуры. Каждый вызов создаёт конкретный специализированный контейнер. Именно так std создаёт свои коллекции. 🎯
Часто задаваемые вопросы
Урок «Обобщённые структуры данных» бесплатный?
Да — полный текст урока «Обобщённые структуры данных» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Zig Academy, подпишись на CoddyKit PRO. Курс Zig Academy содержит 4 уроков всего.
Чему я научусь в уроке «Обобщённые структуры данных»?
Используйте шаблон функции, возвращающей тип. Ты практикуешь Zig Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Zig Academy?
Предыдущий опыт не требуется. Zig Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «Обобщённые структуры данных»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Zig Academy?
Да. Каждый урок Zig Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Функции, принимающие тип
- Обобщённые структуры данных
- @TypeOf и отражение типов
- Параметры anytype