quinta-feira, 28 de maio de 2009

Lua - Estruturas de dados: Tabelas

Tabelas Lua.

As tabelas, em Lua, são estruturas de dados da linguagem. São comuns em outras linguagens, estruturas de dados do tipo vetor e lista. Porem, Lua possui somente as tabelas, pois são flexíveis e permitem combinações.

Este artigo visa tratar, de maneira introdutória, seu uso e suas propriedades.

Na verdade já tivemos contato com esta estrutura nos últimos artigos sobre a biblioteca NCLua. Como vimos, a biblioteca se baseia na troca de mensagens entre o formatador NCL e a máquina de execução Lua. Tal comunicação acontece através do envio e recebimento de tabelas Lua. Essas tabelas representam os eventos, que acontecem durante a execução da aplicação.

Relembrando:

Vimos que para um script Lua se comunicar com o documento NCL é necessário que uma tabela, específica, seja enviada através do comando event.post().

Por exemplo, para que um script Lua inicie uma ancora em um nó NCL, o seguinte evento deve ser gerado:

tabela = {
class = ‘ncl’,
type = ‘presentation’,
action = ‘start’,
label = ‘nome_ancora’
}

Então esta tabela deve ser enviada ao NCL:

event.post( tabela )

Outro exemplo. Cada vez que um botão de teclado ou de controle remoto é pressionado uma tabela é gerada, porem no sentido contrário, no sentido NCL para Lua, e as propriedades da tabela contem outros valores, como por exemplo, a propriedade class, que contem o valor ‘key’.

Tabelas Lua.

Até agora vimos seu uso apenas na interface de comunicação NCLua, veremos agora a essência das tabelas, quais suas principais características e funções dentro da linguagem Lua.

Para começar, temos que saber que uma tabela começa e termina com colchetes, dado seu identificador. Então uma tabela t vazia:

t = {}

Uma propriedade importante é saber o tamanho da tabela, e conseguimos isso através do uso de #.

> print (#t)
0

O seguinte exemplo cria uma tabela com valores:

carro = {
[‘cor’] = ‘cinza’,
[‘cilindradas’] = ‘1600’,
[‘ano’] = ‘2008’,
[‘modelo’] = ‘2009’,
}

Uma tabela é composta por uma coleção de chaves e valores. Onde cada chave esta associada um valor. No exemplo, as palavras entre [ ] são as chaves e os seus valores vem depois do sinal de =, e cada par é separado do outro por virgula.

Usando a tabela:

> print( carro[‘ano’] )
2008

>print( carro[ ‘portas’] )
nil

Caso o índice não exista na tabela o valor nil é retornado.

Flexibilidade:

Como disse no inicio, tabelas tem muita flexibilidade, os índices nem sempre precisam estar entre [ ]. Um outro jeito de escrever a tabela acima é:

carro = {
cor = ‘cinza’,
cilindradas = ‘1600’,
ano = ‘2008’,
modelo = ‘2009’,
}

Outro jeito de acessar os valores:

Dada a tabela, os seguintes meios de acesso aos valores:

ano = { mes = { dia = “quarta” } }

> print( ano.mes.dia )
quarta
> print( ano.mes[‘dia’] )
quarta

> print( ano[‘mes’][‘dia’] )
quarta

Índices implícitos

Índices numéricos são implícitos quando há ausência de declaração deles no corpo da tabela. Por exemplo:

tabela = {“a”, “b”, “c”}

Esta implícito que os índices de “a”, “b” e “c” são 1, 2 e 3 respectivamente. Portanto:

>print( tabela[1])
a

A função ipairs

Muitas vezes temos que fazer iterações sobre uma tabela inteira, tendo que acessar cada par (índice, valor) da tabela. Fazemos isso usando laços de controle como um bloco while ou for, por exemplo, e implicitamente declarando um valor de inicio e final para as iterações. Uma alternativa mais eficiente para iterar sobre um array ou tabela é a função ipairs.

Considere o seguinte array ou tabela:

> letras = { “a”, ”b”, ”c” }

Se quisermos imprimir cada índice e cada valor usando um bloco for faríamos desta maneira:

>for i = 1, #letras do
>> print(“índice: ” .. i .. “ valor: ” .. letras[i] )
>end
indice: 1 valor: a
indice: 2 valor: b
indice: 3 valor: c

De maneira similar mas usando ipairs:

>for i, n in ipairs( letras ) do
>> print(“índice: ” .. i .. “ valor: ” .. n )
>end
indice: 1 valor: a
indice: 2 valor: b
indice: 3 valor: c

O trecho de código in ipairs( tabela ), sugere um loop sobre a tabela passada como parâmetro. A função percorre a tabela de maneira ordenada, atribuindo o índice ao primeiro parâmetro passado antes de in, que é i, e passa o valor correspondente para o segundo parâmetro, n.

Importante notar que a função ipairs percorre índices numéricos sem intervalos. Isto quer dizer que dada a tabela

> letras = { “a”, b, ”c” }

a função iria ate o primeiro índice apenas, pois o índice de b não é 2.

A biblioteca table

A linguagem ainda oferece outras funções básicas. A seguir listo algumas:

table.sort (tabela) – ordena uma tabela.
table.insert (tabela, valor) – insere o valor na tabela, na ultima posição.
table.remove (tabela, valor) – remove o valor na tabela, na ultima posição.

Bibliografia

Os conceitos vistos acima são o básico que devemos saber sobre o uso de tabelas. Para saber mais sobre o assunto recomendo a consulta aos seguintes livros:
# Programming in Lua do Roberto Ierusalimschy, que é considerado a bíblia da linguagem e esta disponível on-line no site www.lua.org

e
# Beginning Lua Programming de Kurt Jung e Aaron Brown, livro o qual baseei este artigo.

Ainda no site lua.org você encontra os binários para executar seus programas em Lua, para que usa Windows tem uma opção la também, basta baixar e executar o .exe.



Publicado por Günter H. Herweg Filho sob Formação
Sem Comentários

Texto originalmente publicado no portal imasters

fontehttp://www.valdecir.tv.br/

Nenhum comentário:

Postar um comentário