Si desea argumentos con nombre y valores predeterminados como PHP o Python, puede llamar a su función con un constructor de tabla:
myfunction{a,b=3,c=2}
(Esto se ve en muchos lugares de Lua, como las formas avanzadas de los módulos y constructores de protocolo de LuaSocket en IUPLua ).
La función en sí podría tener una firma como esta:
function myfunction(t)
setmetatable(t,{__index={b=7, c=5}})
local a, b, c =
t[1] or t.a,
t[2] or t.b,
t[3] or t.c
end
Cualquier valor que falte en la tabla de parámetros se tomará de la __index
tabla en su metatabla (consulte la documentación sobre metatablas ).
Por supuesto, los estilos de parámetros más avanzados son posibles usando constructores de tablas y funciones; puede escribir lo que necesite. Por ejemplo, aquí hay una función que construye una función que toma tablas de argumentos con nombre o posicionales de una tabla que define los nombres de los parámetros y los valores predeterminados y una función que toma una lista de argumentos normal.
Como característica que no es del nivel del idioma, estas llamadas se pueden cambiar para proporcionar nuevos comportamientos y semánticas:
- Se pueden hacer variables para aceptar más de un nombre
- Las variables de posición y las variables de palabras clave se pueden intercalar, y la definición de ambas puede dar prioridad a cualquiera de las dos (o provocar un error)
- Se pueden crear variables sin posición de solo palabras clave, así como variables de solo posición sin nombre
- La construcción de la tabla bastante detallada se puede realizar analizando una cadena
- La lista de argumentos podría usarse literalmente si la función se llama con algo diferente a 1 tabla
Algunas funciones útiles para escribir traductores de argumentos son unpack
(pasando a table.unpack
5.2), setfenv
(en desuso en 5.2 con la nueva _ENV
construcción) y select
(que devuelve un solo valor de una lista de argumentos dada, o la longitud de la lista con '#'
).