Si desea argumentos con nombre y valores por defecto como PHP o Python, puede llamar a su función con un constructor tabla:
myfunction{a,b=3,c=2}
(Esto se ve en muchos lugares en Lua, como the advanced forms of LuaSocket's protocol modules y constructores en . IUPLua)
La función en sí podría tener una firma así:
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
-- function continues down here...
end
Cualquier valor f desaparecidos La tabla de parámetros se tomará de la tabla __index
en su metatabla (ver the documentation on metatables).
Por supuesto, es posible utilizar estilos de parámetros más avanzados utilizando constructores de tablas y funciones; puede escribir lo que necesite. Por ejemplo, here es una función que construye una función que toma tablas de argumentos nominales o posicionales de una tabla que define los nombres de parámetros y valores predeterminados y una función que toma una lista de argumentos regulares.
Como una característica no a nivel de lenguaje, este tipo de llamadas se pueden cambiar para proporcionar nuevos comportamientos y semántica:
- variables se podrían hacer para aceptar más de un nombre
- las variables de posición y de palabras clave variables pueden intercalar - y que define tanto puede dar preferencia a cualquiera de los dos (o causar un error)
- palabra clave de sólo las variables sin posición se pueden realizar, así como sin nombre de sólo posición de las unidades
- La construcción mesa bastante-verbosa podría hacerse analizando como Tring
- La lista de argumentos se podría utilizar textualmente si la función se llama con algo distinto de 1 mesa
Algunas funciones útiles para la escritura de traductores argumento se unpack
(que se mueve a table.unpack
en 5.2), setfenv
(en desuso en 5.2 con la nueva construcción _ENV
) y select
(que devuelve un único valor de una lista de argumentos dada, o la longitud de la lista con '#'
).
A Acabo de empezar a usar lua; lo mantendré simple por el momento, pero su publicación es muy informativa. Podría ser útil más adelante. Gracias. – ripat
En la mayoría de los casos, mantenerlo simple es el camino a seguir. Las interfaces de metaparámetros solo son realmente necesarias para objetos con una gran cantidad de atributos opcionales (como objetos UI). –
Creo que esta respuesta es la que resuelve las preguntas, no la que actualmente está marcada como aceptada. Gracias por la iluminación :) – Undo