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 '#'
).
x or default
expresión que también se usa en esta respuesta no es realmente un verdadero equivalente a los valores predeterminados de los parámetros, sino solo una solución simplista que solo funciona si ambosnil
yfalse
son valores de parámetro no válidos. Digamos que el valor predeterminado para un parámetro booleanox
estrue
y el llamador pasa un explícitofalse
. Luegox or true
cedetrue
, aunquefalse
se pasó explícitamente. Una mejor versión seríaif x == nil then x = default end
, que también es más legible; aunque todavía no puede manejarnil
argumentos explícitos .En mi opinión, no hay otra forma. Esa es solo la mentalidad de Lua: sin lujos y, excepto por un poco de azúcar sintáctico, sin formas redundantes de hacer cosas simples.
fuente
Técnicamente, hay
b = b == nil and 7 or b
(que debería usarse en el caso de quefalse
haya un valor válido que sefalse or 7
evalúe como 7), pero probablemente no sea lo que está buscando.fuente
false
, una forma más sencilla es poner la variable primero y la predeterminada al final.b = b or 7
b = b or 7
).La única forma que he encontrado hasta ahora que tiene sentido es hacer algo como esto:
function new(params) params = params or {} options = { name = "Object name" } for k,v in pairs(params) do options[k] = v end some_var = options.name end new({ name = "test" }) new()
fuente