- Документация Sift для Roblox объясняет шаблоны работы с неизменяемыми данными в проектах Luau.
- Установка через Wally добавляет Sift с помощью рабочего процесса управления пакетами, ориентированного на Roblox.
- Поддержка TypeScript сохраняет привычный API для разработчиков roblox-ts.
- Неизменяемые обновления возвращают новые значения вместо изменения исходной таблицы.
- Примечание по сопровождению: перед добавлением новой производственной зависимости проверьте состояние репозитория.
Обзор документации Sift для Roblox
Sift — это библиотека неизменяемых данных, созданная для разработки на Luau и Roblox. Вместо непосредственного изменения таблицы неизменяемая утилита создает и возвращает обновленное значение. Такой подход упрощает отслеживание изменений состояния, особенно в системах, управляющих данными игроков, состоянием интерфейса, инвентарями или реплицируемой конфигурацией.
Библиотека тесно связана с операциями над словарями и коллекциями. Ее дизайн во многом вдохновлен Llama, однако реализация использует нативные типы Luau, а не проверку типов во время выполнения. Это различие важно при создании проекта: статическая типизация и валидация являются разными задачами, поэтому команде следует заранее решить, каким образом проверять входящие данные.
Хорошей отправной точкой является репозиторий Sift на GitHub. В нем содержатся инструкции по установке, информация о релизах, примеры и ссылки на сгенерированную документацию.
Рассматривайте каждое преобразование данных как создание нового значения. Сохраняйте предыдущую таблицу доступной для отладки, сравнения состояний или вычисления отката.
Для чего лучше всего подходит Sift
Sift особенно полезен, когда код регулярно преобразует структурированные данные, но вы не хотите, чтобы каждая система изменяла одну и ту же ссылку на таблицу. Распространенные примеры:
- Создание нового профиля игрока из нескольких источников данных.
- Объединение настроек по умолчанию с сохраненными предпочтениями.
- Удаление записей без вызова
table.removeили ручного присваиванияnil. - Предсказуемое обновление состояния интерфейса.
- Совместное использование вспомогательных функций коллекций в кодовых базах Luau и roblox-ts.
| Сценарий использования | Чем помогают неизменяемые операции | Рекомендуемая отправная точка |
|---|---|---|
| Профили игроков | Снижают риск случайных изменений между системами | Операции со словарями |
| Состояние интерфейса | Упрощают сравнение переходов состояния | Небольшие целевые обновления |
| Данные инвентаря | Делают преобразования явными | Вспомогательные функции словарей и массивов |
| Конфигурация | Поддерживает многоуровневые значения по умолчанию и переопределения | Dictionary.merge |
| Общий код TypeScript | Сохраняет привычный стиль API | @rbxts/sift |
Важный контекст проекта
Библиотека является утилитой с открытым исходным кодом, а не Roblox-игрой или игровой системой. Она не предоставляет карты, персонажей, боевые механики, задания или функции прогрессии. Ее задача — помогать разработчикам структурировать и преобразовывать данные внутри проектов Roblox.
В репозитории указано, что Sift распространяется по лицензии MIT, а также предлагается несколько способов распространения. Однако перед использованием следует проверить текущее состояние сопровождения проекта. Команда может зафиксировать известную версию, изучить исходный код или поддерживать собственную ветку, если требуется долгосрочная поддержка.
Установка и настройка проекта
Sift можно добавить в проект Roblox через Wally, roblox-ts или вручную. Выберите один способ и придерживайтесь единой структуры зависимостей во всей команде. Смешивание методов установки без четкой причины может усложнить отслеживание версий и развертывание.
Перед установкой подтвердите версию, используемую проектом, и по возможности зафиксируйте ее. Не копируйте плавающий шаблон в производственную конфигурацию, не проверив доступный релиз.
Сравнение способов установки
| Рабочий процесс | Ссылка на пакет | Лучше всего подходит для | Главное соображение |
|---|---|---|---|
| Wally | csqrl/sift@x.x.x | Проектов Luau, использующих Wally | Замените шаблон выбранной версией |
| roblox-ts | @rbxts/sift | Проектов TypeScript | Установите пакет через npm рабочего процесса проекта |
| Creator Store | Модель Sift | Настройки, ориентированной на Studio | Перед использованием проверьте добавленную иерархию |
| Релиз GitHub | Файлы релиза из репозитория | Ручного контроля или изучения | Ведите собственную запись версии |
Настройка Wally
В проекте на основе Wally добавьте Sift как зависимость в wally.toml:
[dependencies]
Sift = "csqrl/sift@x.x.x"
Замените x.x.x версией, выбранной для проекта. Затем выполните:
wally install
После установки убедитесь, что пакет появился в ожидаемом расположении, а сопоставление Rojo в проекте включает путь к зависимости. Точная структура папок зависит от шаблона проекта, поэтому проверяйте сгенерированное дерево, а не предполагайте, что во всех репозиториях используется одинаковая структура.
Настройка roblox-ts
Sift включает совместимость с TypeScript и API, предназначенный для соответствия аналогу на Luau. В проекте roblox-ts пакет можно установить с помощью:
npm install @rbxts/sift
Простое объединение словарей может выглядеть так:
import { Dictionary, Sift } from "@rbxts/sift"
const result = Dictionary.merge(
{ a: 1, c: 2 },
{ b: 3, c: Sift.None }
)
Важно, что результатом является новый словарь. Исходные входные значения остаются отдельными значениями. Перед использованием конкретного экспорта типа проверьте конфигурацию компилятора и версию пакета.
Выберите способ подключения зависимости
Решите, будет ли проект использовать Wally, roblox-ts, модель из Creator Store или релиз, управляемый вручную. Зафиксируйте это решение в README проекта.
Зафиксируйте и установите пакет
Выберите известную версию, добавьте зависимость и выполните соответствующую команду установки. Храните lock-файл или запись о версии в системе контроля версий.
Проверьте путь импорта
Откройте небольшой тестовый модуль и импортируйте планируемую к использованию утилиту коллекций. Устраните проблемы с сопоставлением пакетов до интеграции Sift в более крупные системы.
Выполните целевой тест
Объедините два небольших словаря, проверьте ожидаемый результат и убедитесь, что исходные входные значения не изменились.
Шаблоны неизменяемых словарей
Операции со словарями являются наиболее практичной отправной точкой для многих систем Roblox. Словарь — это таблица «ключ-значение», например профиль, содержащий валюту, настройки и разблокированный контент. При неизменяемых обновлениях каждая операция создает новое значение вместо изменения общей таблицы на месте.
Храните текущее состояние в одной переменной, вычисляйте следующее состояние с помощью Sift и заменяйте ссылку только после успешного выполнения преобразования.
Распространенные цели преобразований
| Цель | Шаблон Sift | Ожидаемый результат |
|---|---|---|
| Объединить значения | Dictionary.merge | Новый словарь с выбранными ключами |
| Удалить значение | Использовать вспомогательную функцию удаления библиотеки | Новый словарь без выбранной записи |
| Применить целевое обновление | Использовать вспомогательную функцию обновления словаря | Изменяется только нужный ключ |
| Представить удаление | Sift.None в поддерживаемых операциях | Выбранный ключ отсутствует в объединенном результате |
| Сохранить входные данные | Избегать прямого присваивания в исходную таблицу | Предыдущее состояние остается доступным |
Маркер Sift.None особенно полезен в коде, использующем объединение. В приведенном в документации примере объединение { a: 1, c: 2 } с { b: 3, c: Sift.None } создает { a: 1, b: 3 }. Удаление становится частью преобразования, а не отдельным шагом изменения данных.
const base = {
displayName: "Builder",
soundEnabled: true,
tutorialSeen: true
}
const next = Dictionary.merge(base, {
soundEnabled: false,
tutorialSeen: Sift.None
})
Этот пример демонстрирует две полезные идеи: обычную замену soundEnabled и явное удаление tutorialSeen. Всегда проверяйте фактическое поведение конкретной вспомогательной функции с версией, установленной в проекте, особенно при переходе с другой библиотеки неизменяемых данных.
Почему важно сохранять входные данные
Прямая мутация может создать скрытую связанность:
profile.Coins += 50
Любая система, хранящая ту же ссылку на таблицу, сразу увидит это изменение. В небольшом скрипте это может быть приемлемо, однако рассуждать о таком коде становится сложнее, когда данные профиля используются системами сохранения, интерфейса, аналитики и игрового процесса.
Неизменяемый подход делает переход состояния более осознанным:
local updatedProfile = Dictionary.merge(profile, {
Coins = profile.Coins + 50,
})
Точный импорт модуля зависит от структуры проекта. Главное — вычислить updatedProfile как новое значение, а затем передать его системам, которым требуется обновленное состояние.
Делайте преобразования небольшими
Не создавайте одно большое преобразование, изменяющее несвязанные части профиля. Небольшие операции проще тестировать и проверять:
- Обновляйте валюту отдельно от настроек.
- Объединяйте серверные значения по умолчанию перед применением предпочтений игрока.
- Удаляйте временные поля перед сохранением.
- Храните состояние, относящееся только к интерфейсу, отдельно от постоянных данных профиля.
- Давайте имена промежуточным значениям, если преобразование состоит из нескольких этапов.
Сравнение рабочих процессов Luau и roblox-ts
Sift предназначен для поддержки рабочих процессов Luau и roblox-ts. Концептуальный API остается похожим, но окружающие инструменты отличаются. В проектах Luau обычно используются Wally и Rojo, а проекты roblox-ts используют npm и компиляцию TypeScript.
Нативные типы Luau и объявления TypeScript помогают во время разработки, но не проверяют автоматически данные, полученные от игроков, сервисов сохранения или внешних границ.
Проекты Luau
Используйте Wally для управления зависимостями, Rojo для синхронизации при необходимости и целевые тесты модулей для преобразований коллекций.
Проекты roblox-ts
Установите @rbxts/sift, используйте типизированный API и согласуйте версии пакета с конфигурацией компилятора TypeScript.
Слой валидации
Добавьте отдельную библиотеку валидации или проверки уровня проекта, когда данные пересекают границу доверия или попадают в постоянное хранилище.
Выбор между Luau и TypeScript
| Профиль проекта | Лучший вариант | Соображение при использовании Sift |
|---|---|---|
| Существующая кодовая база Luau | Пакет Luau | Сохраняйте простоту импортов и сопоставления пакетов |
| Типизированный рабочий процесс команды | roblox-ts | Используйте встроенную совместимость с TypeScript |
| Смешанный репозиторий | Общие соглашения | Документируйте, какой слой отвечает за каждое преобразование |
| Ненадежный ввод | Любой язык | Добавьте отдельную проверку во время выполнения |
| Долгосрочное сопровождение | Зафиксированная зависимость | Запишите выбранную версию и проверяйте состояние проекта |
Тестирование неизменяемого поведения
Полезный тест должен проверять и результат, и исходные входные данные:
local original = {
Coins = 100,
Rank = 2,
}
local updated = Dictionary.merge(original, {
Coins = 150,
})
assert(updated.Coins == 150)
assert(original.Coins == 100)
Этот тест намеренно небольшой. Он подтверждает самое важное свойство: обновленное значение содержит новые данные, а исходное остается неизменным. Расширьте набор тестов для вложенных словарей, отсутствующих ключей, маркеров удаления и массивов, используемых вашим приложением.
Сопровождение, совместимость и лучшие практики
Зависимость является частью технической поверхности вашего проекта. Перед использованием Sift в новой производственной системе изучите активность репозитория, историю релизов, лицензию, доступность пакета и совместимость с текущим набором инструментов Roblox.
Если библиотека больше не сопровождается активно, зафиксируйте версию, сохраните документацию, от которой зависит проект, и решите, будет ли команда поддерживать собственную ветку или заменит библиотеку, если будущие изменения инструментов вызовут проблемы.
Контрольный список проверки зависимости
Перед добавлением Sift:
- Подтвердить выбранную версию пакета и способ установки
- Проверить поведение объединения словарей и удаления в текущем проекте
- Проверить совместимость Luau, roblox-ts, Wally, Rojo и компилятора
- Добавить проверку во время выполнения для ненадежных или постоянных данных
- Зафиксировать план действий на случай изменений сопровождения или совместимости
Практические инженерные правила
- Не изменяйте общее состояние случайно. Рассматривайте таблицы профилей и конфигурации как значения, которые следует намеренно заменять.
- Сохраняйте четкие границы пакетов. Утилитарная библиотека должна преобразовывать данные, а системы сохранения и сетевого взаимодействия — отвечать каждая за свою область.
- Проверяйте данные на границах. Статические типы не гарантируют, что сохраненные данные или удаленный ввод имеют ожидаемую структуру.
- Предпочитайте явные промежуточные значения. Такие имена, как
mergedDefaults,playerSettingsиnextProfile, упрощают проверку преобразований. - Тестируйте поведение удаления. Отсутствующий ключ, значение
nilиSift.Noneмогут иметь разные значения в операции объединения. - Документируйте выбранную версию. Это особенно важно, если проект будут сопровождать участники, которые не выбирали исходную зависимость.
Рекомендуемая структура документации
| Страница документации | Что включить |
|---|---|
| Установка | Способ подключения пакета, версия, команды, сопоставление папок |
| Примечания к API | Используемые проектом вспомогательные функции и краткие примеры |
| Соглашения о состоянии | Какие таблицы являются неизменяемыми и кто отвечает за их замену |
| Валидация | Проверки во время выполнения для сохраненных и удаленных данных |
| План обновления | Тесты совместимости, проверка зависимости, запасной вариант |
Сгенерированная документация, на которую ссылается экосистема проекта, может помочь с точными сигнатурами, однако репозиторий остается лучшим местом для изучения исходного кода, релизов и лицензионной информации. Не копируйте примеры, не проверив, соответствует ли их синтаксис версии, установленной в вашем проекте.
Часто задаваемые вопросы о документации Sift для Roblox
Начните с одного преобразования словаря, проверьте неизменность входных данных и переходите к более крупным системам состояния только после того, как поведение станет понятным.
Q: Для чего используется Sift в разработке Roblox?
Sift — это библиотека неизменяемых данных для Luau и roblox-ts. Она помогает разработчикам создавать обновленные словари, массивы и значения коллекций без непосредственного изменения исходной таблицы.
Q: Как установить Sift в проект Roblox?
Документированные способы включают Wally, пакет roblox-ts с именем @rbxts/sift, модель Roblox Creator Store и файлы релиза GitHub. Выберите один способ и запишите версию, используемую проектом.
Q: Что делает Sift.None?
В поддерживаемых операциях объединения Sift.None обозначает удаление ключа. Например, объединение словаря, в котором для c установлено значение Sift.None, может создать результат без ключа c.
Q: Заменяет ли Sift проверку данных во время выполнения?
Нет. Нативные типы Luau и типы TypeScript помогают выполнять проверки во время разработки, но команде следует добавить отдельный слой валидации для удаленного ввода, сохраненных данных и других ненадежных границ.