- La documentación de Sift para Roblox explica patrones de datos inmutables para proyectos Luau.
- La instalación mediante Wally añade Sift mediante un flujo de paquetes orientado a Roblox.
- La compatibilidad con TypeScript mantiene la API familiar para los desarrolladores de roblox-ts.
- Las actualizaciones inmutables devuelven nuevos valores en lugar de cambiar la tabla original.
- Nota de mantenimiento: verifica el estado del repositorio antes de comenzar a usar una nueva dependencia en producción.
Descripción general de la documentación de Sift para Roblox
Sift es una biblioteca de datos inmutables diseñada para el desarrollo con Luau y Roblox. En lugar de cambiar una tabla directamente, una utilidad inmutable crea y devuelve un valor actualizado. Este enfoque puede facilitar el seguimiento de los cambios de estado, especialmente en sistemas que administran datos de jugadores, estado de la interfaz, inventarios o configuraciones replicadas.
La biblioteca está estrechamente relacionada con las operaciones sobre diccionarios y colecciones. Su diseño está muy influenciado por Llama, mientras que su implementación utiliza tipos nativos de Luau en lugar de depender de la comprobación de tipos en tiempo de ejecución. Esta distinción es importante al crear un proyecto: el tipado estático y la validación son preocupaciones independientes, por lo que los equipos deben decidir cómo validar los datos entrantes.
Un buen punto de partida es el repositorio de Sift en GitHub. Contiene notas de instalación, información sobre versiones, ejemplos y enlaces a documentación generada.
Trata cada transformación de datos como un nuevo valor. Conserva la tabla anterior para depurar, comparar estados o calcular una reversión.
Para qué es más adecuado Sift
Sift resulta especialmente útil cuando tu código transforma repetidamente datos estructurados sin querer que cada sistema mute la misma referencia de tabla. Algunos ejemplos habituales son:
- Crear un nuevo perfil de jugador a partir de varias fuentes de datos.
- Combinar configuraciones predeterminadas con preferencias guardadas.
- Eliminar entradas sin llamar manualmente a
table.removeni asignarnil. - Actualizar el estado de la interfaz de forma predecible.
- Compartir utilidades de colecciones entre bases de código Luau y roblox-ts.
| Caso de uso | Por qué ayudan las operaciones inmutables | Punto de partida recomendado |
|---|---|---|
| Perfiles de jugadores | Reduce los cambios accidentales entre sistemas | Operaciones de Dictionary |
| Estado de la interfaz | Facilita la comparación de las transiciones de estado | Actualizaciones pequeñas y específicas |
| Datos del inventario | Mantiene explícitas las transformaciones | Utilidades de diccionarios y arrays |
| Configuración | Admite valores predeterminados y sobrescrituras por capas | Dictionary.merge |
| Código TypeScript compartido | Conserva un estilo de API familiar | @rbxts/sift |
Contexto importante del proyecto
La biblioteca es una utilidad de código abierto, no una experiencia de Roblox ni un sistema de juego. No proporciona mapas, personajes, mecánicas de combate, misiones ni funciones de progresión. Su función es ayudar a los desarrolladores a estructurar y transformar datos dentro de proyectos de Roblox.
El repositorio identifica Sift como un proyecto con licencia MIT y ofrece varias vías de distribución. Sin embargo, conviene revisar su estado actual de mantenimiento antes de adoptarlo. Un equipo puede optar por fijar una versión conocida, inspeccionar el código fuente o mantener un fork si necesita soporte a largo plazo.
Instalación y configuración del proyecto
Sift puede añadirse a un proyecto de Roblox mediante Wally, roblox-ts o un flujo de trabajo manual. Elige una ruta y mantén una estructura de dependencias coherente en todo el equipo. Mezclar métodos de instalación sin un motivo claro puede dificultar el seguimiento de versiones y la implementación.
Antes de instalar, confirma la versión que utiliza tu proyecto y fíjala siempre que sea posible. Evita copiar un marcador de posición flotante en la configuración de producción sin comprobar la versión disponible.
Comparación de rutas de instalación
| Flujo de trabajo | Referencia del paquete | Más adecuado para | Consideración principal |
|---|---|---|---|
| Wally | csqrl/sift@x.x.x | Proyectos Luau que usan Wally | Sustituye el marcador de posición por una versión seleccionada |
| roblox-ts | @rbxts/sift | Proyectos TypeScript | Instálalo mediante el flujo de npm del proyecto |
| Creator Store | Modelo de Sift | Configuraciones centradas en Studio | Revisa la jerarquía insertada antes de usarla |
| Versión de GitHub | Archivos de versión del repositorio | Control o inspección manual | Mantén tu propio registro de versiones |
Configuración de Wally
Para un proyecto basado en Wally, añade Sift como dependencia en wally.toml:
[dependencies]
Sift = "csqrl/sift@x.x.x"
Sustituye x.x.x por la versión seleccionada para tu proyecto. Después, ejecuta:
wally install
Tras la instalación, confirma que el paquete aparece en la ubicación esperada y que el mapeo de Rojo de tu proyecto incluye la ruta de la dependencia. La estructura exacta de carpetas depende de la plantilla del proyecto, así que verifica el árbol generado en lugar de asumir que todos los repositorios utilizan la misma estructura.
Configuración de roblox-ts
Sift incluye compatibilidad con TypeScript mediante una API diseñada para coincidir con su equivalente de Luau. Un proyecto roblox-ts puede instalar el paquete con:
npm install @rbxts/sift
Una combinación sencilla de diccionarios puede verse así:
import { Dictionary, Sift } from "@rbxts/sift"
const result = Dictionary.merge(
{ a: 1, c: 2 },
{ b: 3, c: Sift.None }
)
El comportamiento importante es que el resultado es un diccionario nuevo. Las entradas originales siguen siendo valores independientes. Confirma la configuración de tu compilador y la versión del paquete antes de depender de una exportación de tipo concreta.
Elige la ruta de dependencia
Decide si tu proyecto utilizará Wally, roblox-ts, un modelo de Creator Store o una versión administrada manualmente. Documenta esa decisión en el README del proyecto.
Fija e instala el paquete
Selecciona una versión conocida, añade la dependencia y ejecuta el comando de instalación correspondiente. Mantén el archivo de bloqueo o el registro de versiones bajo control de versiones.
Verifica la ruta de importación
Abre un módulo de prueba pequeño e importa la utilidad de colecciones que planeas utilizar. Resuelve los problemas de mapeo del paquete antes de integrar Sift en sistemas más grandes.
Ejecuta una prueba específica
Combina dos diccionarios pequeños, confirma el resultado esperado y comprueba que las entradas originales no hayan cambiado.
Patrones de diccionarios inmutables
Las operaciones de diccionarios son el punto de entrada más práctico para muchos sistemas de Roblox. Un diccionario es una tabla de pares clave-valor, como un perfil que contiene monedas, configuraciones y contenido desbloqueado. Con las actualizaciones inmutables, cada operación produce un valor de reemplazo en lugar de modificar la tabla compartida directamente.
Mantén el estado actual en una variable, calcula el siguiente estado con Sift y reemplaza la referencia solo después de que la transformación se complete correctamente.
Objetivos habituales de transformación
| Objetivo | Patrón de Sift | Resultado esperado |
|---|---|---|
| Combinar valores | Dictionary.merge | Un diccionario nuevo que contiene las claves seleccionadas |
| Eliminar un valor | Utiliza la utilidad de eliminación de la biblioteca | Un diccionario nuevo sin la entrada seleccionada |
| Aplicar una actualización específica | Utiliza una utilidad de actualización de diccionario | Solo cambia la clave indicada |
| Representar una eliminación | Sift.None en las operaciones compatibles | La clave seleccionada se omite del resultado combinado |
| Conservar los datos de entrada | Evita asignaciones directas a la tabla de origen | El estado anterior permanece disponible |
El marcador Sift.None es especialmente útil en código basado en combinaciones. En el ejemplo documentado, combinar { a: 1, c: 2 } con { b: 3, c: Sift.None } produce { a: 1, b: 3 }. Esto comunica la eliminación como parte de la transformación, en lugar de mezclar la lógica de eliminación con un paso de mutación independiente.
const base = {
displayName: "Builder",
soundEnabled: true,
tutorialSeen: true
}
const next = Dictionary.merge(base, {
soundEnabled: false,
tutorialSeen: Sift.None
})
El ejemplo muestra dos ideas útiles: un reemplazo normal para soundEnabled y una eliminación explícita para tutorialSeen. Prueba siempre el comportamiento exacto de la utilidad con la versión instalada en tu proyecto, especialmente al migrar desde otra biblioteca inmutable.
Por qué es importante conservar las entradas
La mutación directa puede crear acoplamientos ocultos:
profile.Coins += 50
Cualquier sistema que conserve la misma referencia de tabla puede observar ese cambio inmediatamente. Esto puede ser aceptable en un script pequeño, pero resulta más difícil de razonar cuando los datos del perfil se comparten entre los sistemas de guardado, interfaz, analítica y jugabilidad.
Un enfoque inmutable hace que la transición sea más deliberada:
local updatedProfile = Dictionary.merge(profile, {
Coins = profile.Coins + 50,
})
La importación exacta del módulo depende de la estructura de tu proyecto. La práctica clave consiste en calcular updatedProfile como un valor nuevo y después pasarlo a los sistemas que necesitan el estado actualizado.
Mantén pequeñas las transformaciones
Evita crear una única transformación grande que cambie partes no relacionadas de un perfil. Las operaciones más pequeñas son más fáciles de probar y revisar:
- Actualiza las monedas por separado de las configuraciones.
- Combina los valores predeterminados del servidor antes de aplicar las preferencias del jugador.
- Elimina los campos temporales antes de guardar.
- Mantén el estado exclusivo de la interfaz fuera de los datos persistentes del perfil.
- Asigna nombres a los valores intermedios cuando una transformación tenga varias etapas.
Comparación de flujos de trabajo entre Luau y roblox-ts
Sift está diseñado para admitir flujos de trabajo tanto con Luau como con roblox-ts. La API conceptual busca mantenerse similar, pero las herramientas del entorno son diferentes. Los proyectos Luau suelen utilizar Wally y Rojo, mientras que los proyectos roblox-ts utilizan npm y la compilación de TypeScript.
Los tipos nativos de Luau y las declaraciones de TypeScript ayudan durante el desarrollo, pero no validan automáticamente los datos recibidos de jugadores, servicios de persistencia o límites externos.
Proyectos Luau
Utiliza Wally para administrar dependencias, Rojo para la sincronización cuando sea necesario y pruebas de módulos específicas para las transformaciones de colecciones.
Proyectos roblox-ts
Instala @rbxts/sift, utiliza la API tipada y mantén las versiones de los paquetes alineadas con la configuración del compilador de TypeScript.
Capa de validación
Añade una biblioteca de validación independiente o comprobaciones específicas del proyecto cuando los datos atraviesen un límite de confianza o entren en el almacenamiento persistente.
Elegir entre Luau y TypeScript
| Perfil del proyecto | Opción más adecuada | Consideración sobre Sift |
|---|---|---|
| Base de código Luau existente | Paquete Luau | Mantén simples las importaciones y los mapeos de paquetes |
| Flujo de trabajo de un equipo tipado | roblox-ts | Utiliza la compatibilidad integrada con TypeScript |
| Repositorio mixto | Convenciones compartidas | Documenta qué capa es responsable de cada transformación |
| Entrada no confiable | Cualquiera de los dos lenguajes | Añade la validación en tiempo de ejecución por separado |
| Mantenimiento a largo plazo | Dependencia fijada | Registra la versión seleccionada y revisa el estado del proyecto |
Probar el comportamiento inmutable
Una prueba útil debe verificar tanto el resultado como la entrada original:
local original = {
Coins = 100,
Rank = 2,
}
local updated = Dictionary.merge(original, {
Coins = 150,
})
assert(updated.Coins == 150)
assert(original.Coins == 100)
Esta prueba es intencionadamente pequeña. Confirma la propiedad más importante: el valor actualizado contiene los datos nuevos mientras que el original permanece sin cambios. Amplía la suite de pruebas para incluir diccionarios anidados, claves ausentes, marcadores de eliminación y arrays utilizados por tu aplicación.
Mantenimiento, compatibilidad y buenas prácticas
Una dependencia forma parte de la superficie técnica de tu proyecto. Antes de utilizar Sift en un nuevo sistema de producción, revisa la actividad del repositorio, el historial de versiones, la licencia, la disponibilidad del paquete y la compatibilidad con tu conjunto actual de herramientas de Roblox.
Si una biblioteca ya no recibe mantenimiento activo, fija la versión, archiva la documentación de la que dependes y decide si tu equipo la bifurcará o reemplazará en caso de que un cambio futuro en las herramientas cause problemas.
Lista de comprobación para revisar dependencias
Antes de añadir Sift:
- Confirma la versión seleccionada del paquete y la ruta de instalación
- Prueba el comportamiento de combinación y eliminación de diccionarios en el proyecto actual
- Comprueba la compatibilidad de Luau, roblox-ts, Wally, Rojo y el compilador
- Añade validación en tiempo de ejecución para datos no confiables o persistentes
- Registra un plan alternativo por si cambian el mantenimiento o la compatibilidad
Reglas prácticas de ingeniería
- No mutes accidentalmente el estado compartido. Trata las tablas de perfiles y configuraciones como valores que deben reemplazarse de forma deliberada.
- Mantén claros los límites de los paquetes. Una biblioteca de utilidades debe transformar datos, mientras que los sistemas de persistencia y redes deben encargarse de sus respectivas responsabilidades.
- Valida en los límites. Los tipos estáticos no pueden garantizar que los datos guardados o las entradas remotas tengan la estructura esperada.
- Prefiere valores intermedios explícitos. Nombres como
mergedDefaults,playerSettingsynextProfilefacilitan la inspección de las transformaciones. - Prueba el comportamiento de eliminación. Una clave ausente, un valor
nilySift.Nonepueden tener significados diferentes en una operación de combinación. - Documenta la versión elegida. Esto es especialmente importante cuando el proyecto pueda ser mantenido por colaboradores que no seleccionaron la dependencia original.
Estructura de documentación sugerida
| Página de documentación | Debe incluir |
|---|---|
| Instalación | Ruta del paquete, versión, comandos y mapeo de carpetas |
| Notas de la API | Utilidades utilizadas por el proyecto y ejemplos breves |
| Convenciones de estado | Qué tablas son inmutables y quién se encarga de los reemplazos |
| Validación | Comprobaciones en tiempo de ejecución para datos guardados y remotos |
| Plan de actualización | Pruebas de compatibilidad, revisión de dependencias y opción alternativa |
La documentación generada y enlazada desde el ecosistema del proyecto puede ayudar con las firmas exactas, mientras que el repositorio sigue siendo el mejor lugar para revisar el código fuente, las versiones y la información de licencia. Evita copiar ejemplos sin comprobar si su sintaxis coincide con la versión instalada en tu proyecto.
Preguntas frecuentes sobre la documentación de Sift para Roblox
Empieza con una transformación de diccionario, prueba que la entrada no cambie y amplía el sistema hacia estados más grandes solo cuando el comportamiento esté claro.
Q: ¿Para qué se utiliza Sift en el desarrollo de Roblox?
Sift es una biblioteca de datos inmutables para Luau y roblox-ts. Ayuda a los desarrolladores a crear diccionarios, arrays y valores de colecciones actualizados sin mutar directamente la tabla original.
Q: ¿Cómo puedo instalar Sift en un proyecto de Roblox?
Las rutas documentadas incluyen Wally, el paquete de roblox-ts llamado @rbxts/sift, un modelo de Roblox Creator Store y archivos de versiones de GitHub. Elige una ruta y registra la versión utilizada por el proyecto.
Q: ¿Qué hace Sift.None?
En las operaciones de combinación compatibles, Sift.None representa la eliminación de una clave. Por ejemplo, combinar un diccionario con c establecido en Sift.None puede producir un resultado en el que c quede omitida.
Q: ¿Sift reemplaza la validación de datos en tiempo de ejecución?
No. Los tipos nativos de Luau y las tipificaciones de TypeScript ayudan con las comprobaciones durante el desarrollo, pero los equipos deben añadir una capa de validación independiente para las entradas remotas, los datos guardados y otros límites no confiables.