Bienvenidos sean a este post, hasta hoy hemos visto que el mecanismo para pasar informacion de los argumentos en una funcion es de tipo posicional, es decir que el primer valor da la posicion al primer argumento y asi sucesivamente, sin embargo algunas veces es mejor especificar los argumentos por nombre.

Anuncios

Para ilustrar este metodo tomaremos como ejemplo el metodo os.rename (de la libreria os), la cual es utilizada para renombrar archivos, y a menudo olvidamos que nombre va primero en la funcion, el nuevo o el viejo, y para evitar eso podriamos redefinir esta funcion para recibir argumentos nombrados:

rename(viejo="temp.lua", nuevo="temp1.lua") // Codigo invalido

Si bien Lua no tiene un soporte directo a esta sintaxis podemos tener una respuesta similar con un sutil cambio de sintaxis, para lograr esto debemos empacar todos los argumentos dentro de una tabla y usar a esta como un solo argumento para la funcion, esta sintaxis especial que provee Lua para llamadas de funciones, pasando el contructor de tabla como argumento nos ayudara con el truco:

rename{viejo="temp.lua", nuevo="temp1.lua"}

Nuestro siguiente paso sera redefinir a la funcion pero ahora con un solo argumento y obtenemos los argumentos de este parametro:

function rename(arg)
	return os.rename(arg.viejo, arg.nuevo)
end

Este estilo de pasaje de parametros es especialmente util cuando la funcion tiene muchos parametros, y la mayoria de las veces es opcional, consideremos una funcion que crea una ventana en una libreria GUI (Interfaz Grafica del Usuario por sus siglas en ingles) ya que podria contener docenas de argumentos, la mayoria opcionales, pero los cuales son mejor especificados por nombre, veamos un ejemplo:

w = Window{x=0, y=0, ancho=300, alto=200,
		titulo="LUA", fondo="blue",
		borde=true }
Anuncios

La funcion Window tiene la libertad de chequear por los argumentos mandatorios, agregar valores predeterminados y similares, asumiendo una primitiva funcion _Window que crea a la nueva ventana y a su vez necesita todos los argumentos en su orden correcto, veamos el siguiente ejemplo:

function Window (opciones)
	if type(opciones.titulo) ~="string" then 
		error("Sin titulo")
	elseif type(opciones.ancho) ~= "number" then
		error("Sin ancho")
	elseif type(opciones.alto) ~= "number" then
		error("Sin alto")
	end

	_Window(opciones.titulo,
		opciones.x or 0,
		opciones.y or 0,
		opciones.ancho,
		opciones.alto,
		opciones.fondo or "white"
		opciones.borde )
end

En este caso tendremos una nueva funcion Window, donde tendremos tres condicionales en las cuales chequearemos el tipo y en caso de no cumplirse la condicion nos notificara un error, para nuestro caso usamos las opciones para el titulo, el ancho y el alto porque son los obligatorios, el resto son opcionales, una vez terminada las condiciones pasamos a la llamada a _Window y como dijimos para esta funcion debemos respetar el orden correcto de los argumentos, en este caso para los casos del eje x, eje y y fondo tenemos un valor adicionado con el or y estos valores son el predeterminado en caso de no informar los valores para estas propiedades, el ultimo caso es borde cuyo valor predeterminado es falso o nil.

En este caso chequeamos por las dudas que no tengamos ningun error pero despues tendremos la posibilidad de acomodar los argumentos en el orden correcto sin necesidad de hacerlo al momento de pasarlos.

Anuncios

En resumen, hoy hemos visto argumentos nombrados, una opcion interesante para determinadas acciones, hemos visto como modificar una funcion para que los acepten, como trabajar con ellos, espero les haya sido util sigueme en Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.

Tambien podes donar

Es para mantenimiento del sitio, gracias!

$1.00