Anuncios

Bienvenidos sean a este post, una alternativa a lo visto en el post anterior es usar una notacion regular de array para acceder a nuestros arrays.

Anuncios

En lugar de escribir:

a:get(i) 

podemos escribir simplemente

a[i] 

Para nuestro ejemplo, esta es la forma mas facil de hacerlo, debido a que nuestras funciones setarray y getarray reciben sus argumentos en el orden que son informados para el correspondiente metametodo, una solucion rapida es definir estos metametodos dentro del codigo de Lua:

local metaarray = getmetatable(array.nuevo(i))
metaarray.__index = array.get
metaarray.__newindex = array.set
metaarray.__len = array.tamano
Nota: Este codigo debe correrse en la implementacion original sin la modificacion del post anterior.
Anuncios

Eso es todo lo que necesitamos para poder usar la sintaxis estandar:

a = array.nuevo(1000)
a[10] = true		-- setarray
print(a[10])		-- getarray	-- Devuelve true
print(#a)		-- getsize	-- Devuelve 1000
Anuncios

Pero si preferimos podemos registrar estos metametodos en nuestro codigo de C, para esto cambiamos de nuevo nuestra funcion de inicializacion:

static const struct arraylib_f [] = {
	{"nuevo", nuevoarray},
	{NULL, NULL}
}

static const struct arraylib_m [] = {
	{"__newindex", setarray},
	{"__index", getarray},
	{"__len", getsize},
	{"__tostring", array2string},
	{NULL, NULL}
}

int luaopen_array (lua_State *L)
{
	luaL_newmetatable(L, "LuaBook.array");
	luaL_register(L, NULL, arraylib_m);
	luaL_register(L, "array", arraylib_f);
	return 1;
}
Anuncios

El resto de las funciones se mantiene de la misma forma pero en este caso seguiremos teniendo un solo metodo publico, nuevo, y el resto solo estan disponibles como metametodos para operaciones especificas.

Anuncios

En resumen, hoy hemos visto como obtener acceso de array para nuestro array, hemos visto como hacerlo en codigo Lua, sin necesidad de aplicar el post anterior, despues hemos visto como aplicarlo por medio del codigo de C para que nos quede una aplicacion mas equilibrada y “monona”, espero les haya sido util sigueme en tumblr, Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.

Anuncios

Tengo un Patreon donde podes acceder de manera exclusiva a material para este blog antes de ser publicado, sigue los pasos del link para saber como.

Tambien podes donar

Es para mantenimiento del sitio, gracias!

$1.00