Roblox GuidebookBase de conocimiento
Español ⌄

Desarrollo / ROBLOX

Ámbito local en Luau: qué nombre de ruta puede leer tu código

Sigue variables locales entre bloques, distingue ocultar un nombre de modificar su valor y comprueba un ejemplo pequeño antes de adaptarlo a un script de Roblox.

Actualizado:

Empieza por la visibilidad #

Imagina una ruta ficticia para caminar. Su nombre general es Harbor y una rama opcional usa temporalmente Tower. La pregunta consiste en determinar qué nombre puede leer una línea concreta del programa. El ámbito describe la región del código donde está disponible una variable declarada. No describe la distancia entre objetos del mundo ni el tiempo que un jugador permanece en la ruta.

Lee primero el ejemplo como Luau corriente. Anota cada declaración y el bloque al que pertenece; después sigue los print en orden de ejecución. Estos ejercicios solamente manipulan cadenas en memoria. No cambian el nombre de un lugar de Roblox, el punto de control de un jugador, un cartel de Workspace ni los datos guardados de una ruta. Esas operaciones necesitan código y comprobaciones independientes.

Sigue una variable hacia un bloque interior #

El primer ejemplo declara routeName antes de un bloque do. El print interior puede leer esa variable externa, porque un bloque anidado accede a nombres declarados en el ámbito que lo contiene. Dentro se declara una nueva variable local, branchName. Los dos nombres representan variables diferentes; imprimirlos juntos no sustituye la etiqueta general. Después del bloque, el último print todavía lee Harbor.

Predice la salida antes de ejecutar: primero Harbor y Tower en la misma línea, luego Harbor. Un tabulador separa los argumentos del primer print. Observa que la variable local branchName no está disponible fuera de su bloque. Si el código posterior necesita un resultado calculado dentro, diseña una devolución o una variable receptora externa adecuada. Quitar local no constituye por sí solo una transferencia clara de datos.

Ámbitos anidadosAbrir imagen a tamaño completo ↗
Diagrama original del ámbito: una declaración interior no sustituye la variable exterior.
local routeName = "Harbor"
do
    local branchName = "Tower"
    print(routeName, branchName)
end
print(routeName)

El bloque exterior no obtiene la local interior #

La visibilidad va del ámbito que contiene al ámbito anidado, pero no vuelve automáticamente hacia fuera. Dibuja un recuadro alrededor del do: branchName pertenece a su interior. Una línea posterior fuera del recuadro no tiene acceso a esa misma declaración local. Declarar otra branchName en un lugar distinto crearía otra variable, en vez de recuperar la original.

Ante un nil inesperado, revisa primero dónde se declaró la variable antes de cambiar su nombre en todas partes. En un ejemplo autónomo ordinario, un identificador sin vínculo puede consultar un global inexistente y dar nil; eso no revela la local interior. El análisis de Studio también puede señalar nombres desconocidos. Interpreta el hallazgo como un problema de límites del código, no como prueba de que se borraron datos guardados.

Separa una declaración de una asignación #

El segundo ejemplo introduce local routeName dentro de un bloque hijo. La nueva declaración oculta la routeName externa: la misma escritura selecciona otra variable, cuyo valor es Tower, dentro de esa región. Al terminar el bloque, vuelve a ser visible la variable exterior, que conserva Harbor. Ocultar un nombre puede ser deliberado, pero también un error cuando pretendías actualizar el valor exterior.

El bloque siguiente utiliza routeName = "Market" sin declarar una nueva local. En esa línea se ve la routeName local exterior, por lo que la asignación cambia su valor. La salida final es Market. Compara las tres líneas: Tower, Harbor, Market. La diferencia importante es la declaración, no las comillas ni el bloque do. Prefiere nombres distintos cuando los valores representan conceptos distintos.

Dos operacionesAbrir imagen a tamaño completo ↗
Comparación original entre ocultar y asignar; no es una captura de la interfaz de Roblox.
local routeName = "Harbor"
do
    local routeName = "Tower"
    print(routeName)
end
print(routeName)
do
    routeName = "Market"
end
print(routeName)

Ten en cuenta dónde aparece la declaración #

Una local está disponible después de su declaración en el ámbito correspondiente. No supongas que una local escrita más abajo explica cualquier aparición anterior del mismo nombre. Recorre el bloque desde arriba y busca la declaración visible en cada uso. Este método resulta especialmente útil en una función con varios bloques pequeños y nombres que se repiten.

Como ejercicio, escribe al lado de cada print qué variable debería leer. Conserva los ejemplos ejecutables sin cambios durante la primera prueba y después realiza una sola modificación controlada. Mover declaraciones, renombrar variables y cambiar valores al mismo tiempo dificulta atribuir una salida nueva a una causa concreta. Registra tu predicción separada del resultado observado para detectar diferencias reales.

Las funciones añaden otra frontera #

Los parámetros y las locales propias de una función pertenecen a su ámbito. El código que la llama no recibe esos nombres simplemente por hacer la llamada. Si necesita una etiqueta calculada, la función debe devolverla y el llamador asignarla a una local con nombre explícito. Una función anidada puede usar locales externas accesibles; trasladarla puede cambiar qué valores alcanza.

Mantén separadas la visibilidad y la comunicación de resultados. Una función que imprime una etiqueta ha producido una salida, pero no necesariamente devolvió un valor a su llamador. Incluso devolver una cadena no actualiza por sí solo una interfaz de Roblox. Examina cada frontera: qué entradas están disponibles, qué resultado sale mediante return y qué parte del código aplicará después ese resultado.

Global no significa todos los scripts de Roblox #

Asignar a un nombre sin una local visible puede crear o modificar un global en el entorno de ejecución actual. Eso amplía el acceso dentro del entorno y dificulta seguir colisiones accidentales de nombres. No establece una variable compartida fiable entre scripts separados de Roblox, clientes y servidor. El ámbito no es un mecanismo de red ni una forma de guardar progreso permanentemente.

Empieza con locales explícitas. Para compartir definiciones entre scripts, estudia una interfaz de módulo diseñada deliberadamente; para comunicar cliente y servidor, el mecanismo apropiado y la validación de datos. Son tareas distintas de este ejercicio. Sustituir una local inaccesible por un global no demuestra que hayas corregido sincronización multijugador, autorización ni almacenamiento del estado de un jugador.

ComprobaciónResultado esperado
Leer exterior dentroHarbor es accesible
Leer interior fueraLa local interior no está disponible
Ocultar routeNameFuera permanece Harbor
Asignar a routeName exteriorFuera cambia a Market

Prepara una entrega comprobable #

Una entrega útil incluye el ejemplo intacto, su salida esperada y la salida de una ejecución real. Señala la declaración interior como una variable nueva y la asignación posterior como una actualización de la variable exterior visible. Añade una comprobación negativa que muestre que el nombre exclusivo del hijo no está disponible fuera. Nuestras aserciones autónomas comprueban estos límites sin modificar juegos existentes de Roblox.

Antes de adaptar el patrón a un script real, identifica la variable concreta y todos los bloques que la utilizan. Explica si el cambio debe ser temporal, actualizar un valor exterior o salir de una función como resultado devuelto. Haz una prueba apropiada en una copia de desarrollo separada y registra la observación. Un ejemplo correcto con cadenas demuestra su comportamiento local, no toda la lógica de rutas del juego.

Campo de registroQué incluir
VariablerouteName
BloqueDeclaración y uso exactos
PredicciónValor esperado de print
ObservaciónSalida real de la ejecución

Fuentes originales

Roblox — Official documentation