varias tipos superponer studio lineas juridica graficos graficas ejemplos argumentos argumentacion function lua

function - tipos - Definir valores predeterminados para argumentos de funciones



tipos de argumentos (4)

En mi opinión, no hay otra manera. Esa es solo la mentalidad Lua: sin adornos, y excepto por un poco de azúcar sintáctico, no hay formas redundantes de hacer cosas simples.

En la wiki de Lua, encontré una forma de definir los valores predeterminados para los argumentos faltantes:

function myfunction(a,b,c) b = b or 7 c = c or 5 print (a,b,c) end

¿Es esa la única forma? El estilo de PHP myfunction (a,b=7,c=5) no parece funcionar. No es que el modo Lua no funcione, solo me pregunto si esta es la única forma de hacerlo.


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()


Si desea argumentos con nombre y valores predeterminados como PHP o Python, puede llamar a su función con un constructor de tablas:

myfunction{a,b=3,c=2}

(Esto se ve en muchos lugares en Lua, como las formas avanzadas de los módulos de protocolos y constructores de IUPLua 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 -- function continues down here... end

Cualquier valor que falte en la tabla de parámetros se tomará de la tabla __index en su metatabla (ver la documentación en metatables ).

Por supuesto, es posible usar estilos de parámetros más avanzados utilizando constructores de tablas y funciones; puede escribir lo que necesite. Por ejemplo, here hay una función que construye una función que toma tablas de argumentos con nombre o posición de una tabla que define los nombres de los parámetros y los valores por defecto y una función que toma una lista de argumentos regulares.

Como una función que no es de nivel de idioma, tales llamadas se pueden cambiar para proporcionar nuevos comportamientos y semántica:

  • Se podría hacer que las variables acepten 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 ellas (o causar un error)
  • Se pueden realizar variables sin posición de palabras clave, así como también variables sin posición con nombre único.
  • La construcción de la tabla bastante detallada podría hacerse mediante el análisis de una cadena
  • La lista de argumentos se puede usar textualmente si se llama a la función con algo que no sea 1 tabla

Algunas funciones útiles para escribir traductores de argumentos son unpack (moviéndose a table.unpack en 5.2), setfenv (obsoleto en 5.2 con la nueva construcción _ENV ), y select (que devuelve un valor único de una lista de argumentos dada, o la longitud del lista con ''#'' ).


Técnicamente, hay b = b == nil and 7 or b (que se debe usar en el caso en que el valor false or 7 evalúe en 7), pero probablemente eso no sea lo que está buscando.