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.