Bienvenidos sean a este post, hoy hablaremos sobre los constructores de las tablas, tipo que explicamos en este post, las cuales son expresiones que se encargan de crear e inicializar a las mismas, el constructor mas simple que vimos es el de inicio por medio de dos llaves {} lo cual crea una tabla vacia, estos constructores tambien inicializan arrays (pueden ser llamados arreglos, secuencias o listas), un ejemplo de constructor de tabla es la siguiente:

Anuncios
> dias = {"Domingo","Lunes","Martes","Miercoles","Jueves","Viernes","Sabado"}

En este caso creamos una tabla con los dias de la semana, como pueden ver es bastante facil ya que solamente agregamos los datos separados por comas entre las dos llaves ({}), si quisieramos sacar un dato de la misma tendriamos que usar su posicion y como dijimos en un post anterior Lua no inicia desde la posicion cero sino de la posicion uno, veamos el siguiente caso:

tinchicus@dbn001dsk:~/lenguaje/lua$ lua5.3
Lua 5.3.3  Copyright (C) 1994-2016 Lua.org, PUC-Rio
> print(dias[4])
Miercoles
>

En este caso si decimos 4 sera la cuarta posicion, en la mayoria de los lenguajes o casi todos el numero 4 corresponde a la quinta posicion porque estos comienzan a contar desde 0, otra forma de inicializar una tabla es la siguiente:

a = { x=10, y=10 }

Esto equivaldria a un caso que vimos anteriormente:

a = {}; a.x=10; a.y=10;

Cuando nosotros usamos el primer caso cada variable antes del igual equivaldria al identificador de la posicion en la tabla, veamos el siguiente ejemplo:

tinchicus@dbn001dsk:~/lenguaje/lua$ lua5.3
Lua 5.3.3  Copyright (C) 1994-2016 Lua.org, PUC-Rio
> w = { x=10, y=10, label="consola" }
> x = {math.sin(0), math.sin(1), math.sin(2) }
> w[1] = "otro campo"
> x.f = w
> print(w["x"])
10
> print(w[1])
otro campo
> print(x.f[1])
otro campo
> w.x=nil
>

En este caso vamos a tener dos tablas (w y x), la primera contendra tres datos distintos y la segunda contendra tres operaciones, en la primera tabla vamos a usar la posicion x, la posicion y y la posicion label, en el segundo caso a operacion se asignara automaticamente las posiciones como 1, 2 y 3, para la siguiente linea crearemos una posicion llamada 1 en w y le asignaremos un valor, en la siguiente linea crearemos una nueva posicion en x llamada f la cual hara referencia a w, para los siguientes pasos recuperaremos informacion veamos el primero, en este caso mostramos a la posicion x en la tabla w y nos trajo la salida, nuestro siguiente caso es la posicion 1 en la tabla w y nos trae el valor, luego mostraremos el valor de la posicion 1 de la posicion f de la tabla x y nos trae el mismo valor al anterior porque recuerden que f es una referencia de w y ese es el valor de 1, y por ultimo limpiamos el valor de x en w.

Como pueden observar las tablas son creadas todas iguales y los constructores lo unico que afecta es a su inicializacion, cada vez que LUA evalua un constructor esta crea e inicializa una nueva tabla lo cual nos permite usar tablas como listas enlazadas, veamos el siguiente ejemplo:

tinchicus@dbn001dsk:~/lenguaje/lua$ lua5.3
Lua 5.3.3  Copyright (C) 1994-2016 Lua.org, PUC-Rio
> lista = nil
> for linea in io.lines() do
>> lista = { proximo = lista, valor = linea }
>> end
hola
mundo
como
estas
hoy?
^Cinterrupted!
stack traceback:
        [C]: in ?
        [C]: in for iterator 'for iterator'
        stdin:1: in main chunk
        [C]: in ?
>
Anuncios

En este caso primero crearemos una lista enlazada llamada lista a la cual le asignaremos el valor nil, luego por medio de un for a la variable linea le agregaremos un dato por medio de io.lines, este nos mostrara el prompt para ingresar datos, por cada dato ingresado agregaremos a lista dos datos, uno que usaremos como referencia, proximo, y otro donde guardaremos el dato, valor, observen como para cada vuelta actualizaremos a proximo con el valor de lista y a valor con linea, pueden ver como fuimos agregando varias lineas y una vez que hayamos terminado debemos interrumpirlo por medio de Ctrl+C, no se preocupen por la falla, y con esto obtendremos una lista enlazada con informacion, a continuacion ingresaremos el siguiente bloque:

Primer> l = lista
> while l do
>> print(l.valor)
>> l = l.proximo
>> end
hoy?
estas
como
mundo
hola
>

Primero referenciaremos una variable llamada l a lista la cual generamos antes, despues por medio de un while lo haremos mientras l tenga informacion, en el primer paso mostrara el dato almacenado en la posicion de valor, luego pasara al proximo de lista, cuando ingresemos el end se desplegaran los datos como se ve en el ejemplo, se muestran en orden inverso porque nosotros usamos una lista como pila o stack y este nos lo devolvera en ese orden, en nuestros constructores podemos tener varias formas de inicializarlas, veamos el siguiente ejemplo:

Nota: Mas adelante veremos porque Lua trabaja de esta forma con las pilas.
tinchicus@dbn001dsk:~/lenguaje/lua$ lua5.3
Lua 5.3.3  Copyright (C) 1994-2016 Lua.org, PUC-Rio
> poliLinea = {color="azul", ancho=4, npuntos=4,
>> { x = 0, y = 0 },
>> { x = -10, y = 0},
>> { x = -10, y = 1},
>> { x = 0, y = 1 }
>> }
>

En este caso tendremos tres posiciones, una de tipo string y dos de tipo numeros, luego tendremos entre llaves varios valores para la posicion x e y, observen como van entre llaves pero una vez terminado usamos una llave mas para cerrar el primero, ahora usemos estas lineas para recuperar la informacion:

> print(poliLinea.color)
azul
> print(poliLinea[2].x)
-10
> print(poliLinea[3].y)
1
>

En este caso tenemos una de las posiciones, en el primer caso color, y vemos como nos devolvio la informacion, en los siguientes casos usamos el ordinal de numeros 2 y 3 para x e y respectivamente, observen como nos trajo la informacion correctamente pero esta forma de trabajar tiene sus limitaciones por ejemplo no se puede iniciar campos con valores negativos, ni con indices de cadena que no son identificadores apropiados, para estos casos podemos usar un formato mas ideal, con el cual escribiremos el indice a ser inicializado como expresion entre corchetes ([]), veamos el siguiente ejemplo:

tinchicus@dbn001dsk:~/lenguaje/lua$ lua5.3
Lua 5.3.3  Copyright (C) 1994-2016 Lua.org, PUC-Rio
> opnombres = { ["+"] = "suma", ["-"] = "resta",
>> ["*"] = "multiplicar", ["/"] = "dividir" }
> i = 20; s = "-"
> a = {[i+0] = s, [i+1] = s .. s, [i+2] = s .. s .. s }
> print(opnombres[s])
resta
> print(a[22])
---
>

En este caso crearemos una tabla llamada opnombres en el cual crearemos cuatro expresiones entre los corchetes con sus respectivos simbolos, y a su vez lo relacionaremos con una dato de tipo cadena, en cada uno de los casos estara relacionado al signo, despues iniciaremos dos variables la primera llamada i con el valor 20 y la segunda sera s donde guardaremos un guion, en el siguiente caso crearemos una tabla llamada a donde volveremos a usar la expresion anterior pero en este caso guardaremos el valor de i y a su vez lo iremos incrementando, al primero le asignaremos a s, al segundo concatenaremos a dos s y para el tercer caso concatenaremos a tres s, una vez realizado todo esto mostramos el valor de opnombres con el dato almacenado en s y nos devolvio el dato resta porque es el elemento que coincidio con la primer tabla, para el segundo print usamos a la tabla a y le pasamos la poscion 22 observen como al coincidir con la tercer concatenacion nos devolvio tres guiones, cuando hablamos de tablas dijimos que Lua no comienza desde 0 sino desde 1 a la hora de numerar las posiciones, para los programadores de la vieja escuela se puede crear una condicion donde la primera posicion sea 0, para ello tomemos el caso de los dias:

> dias = {[0] = "Domingo","Lunes","Martes","Miercoles","Jueves","Viernes","Sabado"}

En este caso Domingo sera para la posicion 0 porque se lo asignamos y el resto seguira con la numeracion natural que usa Lua cuando no asignamos alguna, entonces en este caso como la primera posicion tiene asignado una expresion Lua no lo cuenta pero si lo hace a partir de la siguiente, por ultimo nosotros tambien podemos separar los elementos por punto y coma (;) en lugar de coma (,) pero es preferible dejarlo para separar secciones en la tabla como la parte de valores por un lado y la parte de lista por otro.

Anuncios

En resumen, hoy hemos visto como es el constructor de tablas, para que sirven, las distintas formas de iniciacion, como trabajar con distintos tipos de informacion, hemos trabajado con listas enlazadas y otros datos, 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