ropa org nombre for lua

org - lua roblox



Acceder a Lua Functions en otros archivos (3)

Requerir el módulo

La función require busca en una serie de lugares para encontrar un módulo. La lista exacta de lugares se puede personalizar ampliamente ajustando los campos en el package tabla global.

La forma más fácil de obtener una idea de cuántos lugares y nombres usa cuando busca un módulo es mirar el mensaje de error producido cuando require falla. Por ejemplo, en mi PC, Lua 5.1 dice esto:

C:/Users/Ross>lua Lua 5.1.4 Copyright (C) 1994-2008 Lua.org, PUC-Rio > require "xyzzy" stdin:1: module ''xyzzy'' not found: no field package.preload[''xyzzy''] no file ''./xyzzy.lua'' no file ''C:/Program Files (x86)/Lua/5.1/lua/xyzzy.lua'' no file ''C:/Program Files (x86)/Lua/5.1/lua/xyzzy/init.lua'' no file ''C:/Program Files (x86)/Lua/5.1/xyzzy.lua'' no file ''C:/Program Files (x86)/Lua/5.1/xyzzy/init.lua'' no file ''C:/Program Files (x86)/Lua/5.1/lua/xyzzy.luac'' no file ''./xyzzy.dll'' no file ''./xyzzy51.dll'' no file ''C:/Program Files (x86)/Lua/5.1/xyzzy.dll'' no file ''C:/Program Files (x86)/Lua/5.1/xyzzy51.dll'' no file ''C:/Program Files (x86)/Lua/5.1/clibs/xyzzy.dll'' no file ''C:/Program Files (x86)/Lua/5.1/clibs/xyzzy51.dll'' no file ''C:/Program Files (x86)/Lua/5.1/loadall.dll'' no file ''C:/Program Files (x86)/Lua/5.1/clibs/loadall.dll'' stack traceback: [C]: in function ''require'' stdin:1: in main chunk [C]: ? >

Después de mirar internamente, el primer lugar "real" que busca xyzzy está en el archivo llamado ./xyzzy.lua . A continuación, intenta una serie de carpetas y nombres en la carpeta donde se encontró lua.exe . Finalmente, busca una DLL que pueda ofrecerlo. La lista de carpetas que busca para un archivo .lua está controlada por el valor de cadena en package.path . (La lista comparable para DLL en package.cpath .) ¿En ese valor, require reemplazará cada uno ? con el nombre del módulo, y luego intente leer el archivo. El primero en tener éxito se usa.

(La historia aquí es un poco más complicada, puede crear "buscadores" que require usar para buscar en diferentes lugares, e incluso cambiar el orden de los buscadores incorporados, pero ese es un tema avanzado).

Entonces, simplemente poner módulos en archivos Lua en el directorio actual debería funcionar bien, y ajustar package.path antes de llamar require que sus propios módulos cubran la mayoría de las peculiaridades que encontrará.

Crea un módulo para requerir

En su forma más simple, un módulo es simplemente algo que se puede almacenar en el package.loaded . package.loaded . Que es lo que require hacer con él una vez que se ha encontrado, por lo que las llamadas múltiples require solo buscar una vez y siempre devolver el mismo valor.

La respuesta tradicional es que ese "algo" sea una tabla, generalmente mayormente poblada por funciones a las que se puede llamar, y ocasionalmente con valores. El módulo math es un buen ejemplo: proporciona muchas funciones como sin y cos , junto con el valor útil math.pi y math.huge .

Además de almacenarse en una tabla, no hay nada especial sobre una función en un módulo. Como cualquier otra función, toma parámetros y devuelve cero o más valores. La única regla real es que un módulo no debe cambiar ni agregar variables globales.

Por lo tanto, un archivo de módulo muy simple puede ser tan simple como:

return { addtwo = function(a, b) return a+b end, subtwo = function(x) return x-2 end, }

que si se almacena como example.lua podría usarse así:

local example = require "example" print(example.addtwo(2,2)) -- 4 print(example.subtwo(42)) -- 40

Un mejor esqueleto de módulo

Poner todo tu código en una sola declaración de tabla no funcionará para la mayoría de los casos reales. No escala bien, y hace que sea difícil expresar claramente la relación entre las funciones que comparten estado.

-- simple modules -- capture the name searched for by require local NAME=... -- table for our functions local M = { } -- A typical local function that is also published in the -- module table. local function addtwo(a,b) return a+b end M.addtwo = addtwo -- Shorthand form is less typing and doesn''t use a local variable function M.subtwo(x) return x-2 end return M

¿Por qué no llamar a la función del módulo ()?

Lua 5.1 incluía una función estándar llamada module() destinada a ser utilizada en la parte superior de las implementaciones de módulos. Su uso nunca fue necesario, y se formó un consenso bastante rápido de que no era una idea tan útil como se esperaba. Desde entonces ha sido desaprobado.

Como resultado, el esqueleto simple que muestro arriba no lo usa, y es portátil para todas las versiones de Lua desde 5.1.

Hola, quiero separar mi archivo Lua en dos archivos. Uno que tiene mis funciones y una que puede llamarlas. He investigado mucho sobre esto y todos los recursos que encuentro no explican este proceso en profundidad. Por lo general, dicen usar:

require "subsystem.lua"

Puse esto en la parte superior de un nuevo archivo Lua que está guardado en el mismo directorio y no puedo acceder a nada.

¿Hay algún archivo de configuración que necesite modificar? ¿Dónde está?


Lo que debe hacer es devolver una tabla con los campos a los que desea acceder en subsystem.lua y luego asignar y usar los campos de esa tabla en su archivo principal. Algo en esta línea:

-- subsystem.lua local function doSomething() -- do something useful here end local function doMore() -- do something else useful end return { doSomething = doSomething, doMore = doMore } -- main.lua local subsystem = require "subsystem" -- don''t add `.lua` to your `require` call subsystem.doSomething() subsystem.doMore()

Es posible que desee consultar el tutorial de Módulos para más detalles.


Probablemente desee usar dofile lugar de require .

dofile acepta nombres de archivo, con rutas.

require nombres de módulo y utiliza rutas de búsqueda de Lua.