Vistas de página en total

lunes, 29 de agosto de 2016

Lua - Parte 3

Tablas

Las tablas son la estructura de datos más potente que tiene Lua. Pero al mismo tiempo es quizás una de las más difíciles de entender (los programadores javascript tienen ventaja en este caso, y entenderán las tablas Lua muy rápidamente).

¿Qué son tablas Lua?

Muy brevemente: las tablas Lua son objetos. O mejor dicho, son arrays asociativos, o sea, arrays donde se puede acceder a los elementos por un identificador (el cual, como veremos, puede ser numérico o no númerico). Esta primera explicación de las tablas es perfecta para programadores javascript, los cuales ya habrán entendido un porcentaje muy alto de lo que son las tablas Lua.
Para programadores que vengan de otros lenguajes, las tablas son muy parecidas a los diccionarios o mapas.
Como vamos a ver, con las tablas Lua podemos implementar arrays (indexados por índice numérico), mapas (accedidos con identificador no númerico) e incluso objetos.

Arrays

Los arrays en Lua son tablas:

    local array = { "a", "b", "c" }

Se puede acceder a los elementos con la notación típica de corchetes:

    array[2] = "b"
    var v = array[3]

Es importante indicar que los arrays en Lua empiezan con el índice 1 (no 0 como ocurre en muchos otros lenguajes de programación). Así, en la tabla anterior, el elemento 1 vale "a", el elemento 2 vale "b" y el elemento 3 vale "c".
En un array podemos guardar elementos de distintos tipos:

    local otroArray = { 1, "a", 45, "Toni" }

Se puede obtener la longitud de un array con el operador # como anticipé en la entrada anterior:

    local len = #otroArray

Por último, podemos crear un array vacío y añadirle luego los elementos:

    local array = { }
    array[1] = "a"
    array[2] = "b"
    array[3] = "c"

Podríamos incluso dejar "huecos" y entonces los elementos sin rellenar sería nil:

    array[5] = "e"
    print(array[4])     -- nil

Mapas o diccionarios

Como he dicho, con las tablas Lua también podemos implementar mapas o diccionarios:

    local socio = { nombre = "Luis", edad = 23, dni = "34756453H" }

En este caso, hemos dado un nombre a cada elemento de la tabla. Este nombre se conoce como identificador y nos permite acceder a los distintos elementos:

    socio["nombre"] = "Luis"
    var age = socio["edad"]

Como se ve, para acceder a los elementos tenemos que entrecomillar el identificador. Si no ponemos las comillas, Lua pensaría que edad es una variable. Por ejemplo:

    print(socio[edad])

La variable edad no existe, y por tanto, el resultado en la consola sería nil.
Lua también permite otra notación para acceder a los elementos por su identificador:

    print(socio.edad);
    socio.nombre = "Ramón"

De esta forma, no se ponen comillas al identificador.
Cuando queremos acceder a un elemento de un mapa de forma indirecta, entonces tendremos que utilizar la notación de corchetes de forma obligatoria:

    var element = "edad"
    print(socio[element])

En este caso, se accede al elemento socio["edad"] o bien socio.edad de forma indirecta.

Al igual que ocurre con los arrays, podemos crear un mapa vacío y añadirle elementos después:

    var socio = { }
    socio.nombre = "Luis"
    socio["edad"] = 34

Incluso, un caso más enrevesado, podemos tener una estructura de datos que sea un mapa y que tenga elementos de array (yo no recomiendo esta práctica, aunque Lua lo permite):

    var socio = { }
    socio.nombre = "Luis"
    socio[3] = "XXX"

pero en este caso, sólo podremos acceder al elemento 3 con la notación de corchetes:

    print(socio[3])      -- correcto
    print(socio.3)        -- error

El operador # para obtener la longitud de un array sólo funciona para arrays "puros", es decir, no funcionará en el caso de mapas.

Anidación

Los elementos de un tabla (o de un array) pueden ser de cualquier tipo, y por tanto, un elemento podría ser un array o tabla, permitiendo así estructuras anidadas:

    local t = { }
    t.nombre = "Luis"
    t.direccion = { }
    t.direccion.calle = "Gran Vía"
    t.direccion.poblacion = "Madrid"

Funciones como elementos de una tabla 

Aunque todavía no hemos visto en profundidad las funciones y sus características, es importante reseñar que una función puede ser un elemento de una tabla. Veamos varios ejemplos:

    local t =  { }

    t.calculo = function(a, b)  return a+b end

    function suma(a,b)
        return a + b
    end
    t.calculo = suma

En el primer caso asignamos una función inline a un elemento de una tabla, y en el segundo caso, asignamos una función existente a un elemento de una tabla.






















No hay comentarios:

Publicar un comentario