Dúvida com tabelas

classic Classic list List threaded Threaded
5 messages Options
Reply | Threaded
Open this post in threaded view
|

Dúvida com tabelas

Ulisses Piassa
Boa tarde galera, tudo blz?

Estou tentando resolver a seguinte situação:

Tenho em ambiente de execução uma tabela gravada em RAM, que precisa ser atualizada com argumentos recebidos. Minha intenção era passar, nestes argumentos, a referência da tabela em memória e o novo valor que determinado índice deve assumir.

Vou tentar ilustrar aqui pra ficar mais claro. Imaginem uma tabela tabelaTeste = {}:

tabelaTeste = {
  
  a = {
     indice1 = 123,
     indice2 = 456
  }

}

Esta tabela é carregada em memória. Portanto, se quisermos alterar o valor de "indice1" para "abc", poderíamos usar:

tabelaTeste.a.indice1 = "abc"

Até aí tudo bem.

No meu caso, tenho uma tabela com 4 níveis, sendo que o último nível é o índice com o valor que deverá ser alterado em tempo de execução.

Neste caso, tentei fazer algo mais ou menos assim:

local tabelaTeste = {
  
  a = {
     indice1 = 123,
     indice2 = 456
  }

}


alteraIndice = function(referencia, estado)

referencia.indice1 = estado

for i, v in pairs(perfil.a.b) do
print (i,v)
end

end

start = function(referencia_da_tabela_enviada_pelo_server)

        -- @referencia_da_tabela_enviada_pelo_server: tabelaTeste['a']['b']

alteraIndice (referencia_da_tabela_enviada_pelo_server, 'abc')
end


Acontece que, no momento que o servidor for enviar a referência desta tabela, ele irá enviar uma string, como por exemplo, "tabelaTeste.a.indice1", argumento este que o Lua, quando receber, não irá entender como uma referência de tabela, o que não irá resultar na manipulação dos estados de seus índices.

Procurei resolver este problema de várias formas, mas até agora não consegui algo que fosse eficiente.

Alguém poderia me dar uma luz nessa situação?

Valeu!!

--
Você recebeu essa mensagem porque está inscrito no grupo "Lua BR" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para [hidden email].
Acesse esse grupo em https://groups.google.com/group/lua-br.
Para mais opções, acesse https://groups.google.com/d/optout.
Reply | Threaded
Open this post in threaded view
|

Re: Dúvida com tabelas

Eric Chiesse
Faz um split da tua string "tabelaTeste.a.indice1" obtendo uma tabela do tipo t = {"tabelaTeste", "a", "indice1"}.
Depois usa os valores para indexar tua tabela: tabela[t[1]][t[2]][t[3]] -- Equivalente a: tabela["tabelaTeste"]["a"]["indice1"]


---
Eric

2016-08-22 16:09 GMT-03:00 Ulisses Piassa <[hidden email]>:
Boa tarde galera, tudo blz?

Estou tentando resolver a seguinte situação:

Tenho em ambiente de execução uma tabela gravada em RAM, que precisa ser atualizada com argumentos recebidos. Minha intenção era passar, nestes argumentos, a referência da tabela em memória e o novo valor que determinado índice deve assumir.

Vou tentar ilustrar aqui pra ficar mais claro. Imaginem uma tabela tabelaTeste = {}:

tabelaTeste = {
  
  a = {
     indice1 = 123,
     indice2 = 456
  }

}

Esta tabela é carregada em memória. Portanto, se quisermos alterar o valor de "indice1" para "abc", poderíamos usar:

tabelaTeste.a.indice1 = "abc"

Até aí tudo bem.

No meu caso, tenho uma tabela com 4 níveis, sendo que o último nível é o índice com o valor que deverá ser alterado em tempo de execução.

Neste caso, tentei fazer algo mais ou menos assim:

local tabelaTeste = {
  
  a = {
     indice1 = 123,
     indice2 = 456
  }

}


alteraIndice = function(referencia, estado)

referencia.indice1 = estado

for i, v in pairs(perfil.a.b) do
print (i,v)
end

end

start = function(referencia_da_tabela_enviada_pelo_server)

        -- @referencia_da_tabela_enviada_pelo_server: tabelaTeste['a']['b']

alteraIndice (referencia_da_tabela_enviada_pelo_server, 'abc')
end


Acontece que, no momento que o servidor for enviar a referência desta tabela, ele irá enviar uma string, como por exemplo, "tabelaTeste.a.indice1", argumento este que o Lua, quando receber, não irá entender como uma referência de tabela, o que não irá resultar na manipulação dos estados de seus índices.

Procurei resolver este problema de várias formas, mas até agora não consegui algo que fosse eficiente.

Alguém poderia me dar uma luz nessa situação?

Valeu!!

--
Você recebeu essa mensagem porque está inscrito no grupo "Lua BR" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para [hidden email].
Acesse esse grupo em https://groups.google.com/group/lua-br.
Para mais opções, acesse https://groups.google.com/d/optout.

--
Você recebeu essa mensagem porque está inscrito no grupo "Lua BR" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para [hidden email].
Acesse esse grupo em https://groups.google.com/group/lua-br.
Para mais opções, acesse https://groups.google.com/d/optout.
Reply | Threaded
Open this post in threaded view
|

Re: Dúvida com tabelas

Tomás Guisasola-2
In reply to this post by Ulisses Piassa
Oi Ulisses

Pelo que você escreveu, o que você recebe não é a _referência_, mas
uma string com o _nome_ da variável que contém a tabela, seguida de
um '.', depois o nome de uma entrada desta tabela etc.  Então,
parece que você precisa interpretar essa string, separar os nomes e
sair indexando a partir de algum ponto de partida.

Acho que alguém (o Luiz Henrique?) já mandou alguma mensagem com um
código que faça isso, mas vou tentar a minha versão :-)

function table_indexer (tab, str)
     if str == '' then
         return tab
     elseif tab == nil then
         return nil
     else
         local key, rest = str:match"^([^.]+)%.?(.*)$"
         if key then
             return table_indexer (tab[key], rest)
         else
             -- erro!
         end
     end
end

assert (table_indexer ({a={b=2}}, "a.b") == 2, "Ops!")
assert (table_indexer ({a={b=2,c=3}}, "a.c") == 3, "Ops!")
assert (table_indexer ({a={b=2,c=3}}, "a.none") == nil, "Ops!")
assert (table_indexer ({a={b=2,c=3}}, "b.b") == nil, "Ops!")
print"Ok!"

Tem alguns casos que você precisa resolver se quer tratar de outro
jeito, como o caso da entrada não existir, ou quando tentar indexar
um valor que não for uma tabela...

Abraço,
Tomás

On 2016-08-22 16:09, Ulisses Piassa wrote:

> Boa tarde galera, tudo blz?
>
> Estou tentando resolver a seguinte situação:
>
> Tenho em ambiente de execução uma tabela gravada em RAM, que precisa
> ser atualizada com argumentos recebidos. Minha intenção era passar,
> nestes argumentos, a referência da tabela em memória e o novo valor
> que determinado índice deve assumir.
>
> Vou tentar ilustrar aqui pra ficar mais claro. Imaginem uma tabela
> tabelaTeste = {}:
>
> tabelaTeste = {
>
>   a = {
>      indice1 = 123,
>      indice2 = 456
>   }
>
> }
>
> Esta tabela é carregada em memória. Portanto, se quisermos alterar o
> valor de "indice1" para "abc", poderíamos usar:
>
> tabelaTeste.a.indice1 = "abc"
>
> Até aí tudo bem.
>
> No meu caso, tenho uma tabela com 4 níveis, sendo que o último
> nível é o índice com o valor que deverá ser alterado em tempo de
> execução.
>
> Neste caso, tentei fazer algo mais ou menos assim:
>
> local tabelaTeste = {
>
>   a = {
>      indice1 = 123,
>      indice2 = 456
>   }
>
> }
>
> alteraIndice = function(referencia, estado)
>
>  referencia.indice1 = estado
>
>  for i, v in pairs(perfil.a.b) do
>  print (i,v)
>  end
>
> end
>
> start = function(referencia_da_tabela_enviada_pelo_server)
>
>         _-- @referencia_da_tabela_enviada_pelo_server:_
> _tabelaTeste['a']['b']_
>
>  alteraIndice (referencia_da_tabela_enviada_pelo_server, 'abc')
> end
>
> Acontece que, no momento que o servidor for enviar a referência desta
> tabela, ele irá enviar uma string, como por exemplo,
> "tabelaTeste.a.indice1", argumento este que o Lua, quando receber,
> não irá entender como uma referência de tabela, o que não irá
> resultar na manipulação dos estados de seus índices.
>
> Procurei resolver este problema de várias formas, mas até agora não
> consegui algo que fosse eficiente.
>
> Alguém poderia me dar uma luz nessa situação?
>
> Valeu!!
>
>  --
>  Você recebeu essa mensagem porque está inscrito no grupo "Lua BR"
> dos Grupos do Google.
>  Para cancelar inscrição nesse grupo e parar de receber e-mails
> dele, envie um e-mail para [hidden email].
>  Acesse esse grupo em https://groups.google.com/group/lua-br [1].
>  Para mais opções, acesse https://groups.google.com/d/optout [2].
>
>
> Links:
> ------
> [1] https://groups.google.com/group/lua-br
> [2] https://groups.google.com/d/optout

--
Você está recebendo esta mensagem porque se inscreveu no grupo "Lua BR" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para [hidden email].
Visite este grupo em https://groups.google.com/group/lua-br.
Para obter mais opções, acesse https://groups.google.com/d/optout.
Reply | Threaded
Open this post in threaded view
|

Re: Dúvida com tabelas

Diego Nascimento
In reply to this post by Ulisses Piassa
Olá Ulisses,

Conheço o básico de lua, eu procuro adequar a estrutura do programa dentro do que eu sei fazer, eu não saberia como fazer o que você quer, mas eu faria de outra forma.

A tabela vai ser a mesma?? eu faria algo assim

-------------------------------------------------------------------------
local tabelaTeste = {  
  a = { indice1 = 123, indice2 = 456 },
  b = { indice1 = 1, indice2 = 55, indice3 = 12}
}

alteraIndice = function(tabela, referencia, estado)
local index_dot = string.find(referencia, '%.')
local ref1 = string.sub(referencia, 1, index_dot-1)
local ref2 = string.sub(referencia, index_dot+1, -1)

tabela[ref1][ref2] = estado
end

-- teste a.indice1
print(tabelaTeste.a.indice1)
alteraIndice(tabelaTeste, 'a.indice1', 'abc')
print(tabelaTeste.a.indice1)

-- teste b.indice3
print(tabelaTeste.b.indice3)
alteraIndice(tabelaTeste, 'b.indice3', 80)
print(tabelaTeste.b.indice3)

-------------------------------------------------------------------------

tenta criar uma tabela para ser padrão, se só houver uma tabela que será manipulada aih vc precisa só da posição do item a ser alterado, manipula a recebida com sub e find ou com patterns matching.

Eu realmente não sei como retornar o nome de uma tabela, ou converter uma string para uma tabela já existente.


Em 22 de agosto de 2016 16:09, Ulisses Piassa <[hidden email]> escreveu:
Boa tarde galera, tudo blz?

Estou tentando resolver a seguinte situação:

Tenho em ambiente de execução uma tabela gravada em RAM, que precisa ser atualizada com argumentos recebidos. Minha intenção era passar, nestes argumentos, a referência da tabela em memória e o novo valor que determinado índice deve assumir.

Vou tentar ilustrar aqui pra ficar mais claro. Imaginem uma tabela tabelaTeste = {}:

tabelaTeste = {
  
  a = {
     indice1 = 123,
     indice2 = 456
  }

}

Esta tabela é carregada em memória. Portanto, se quisermos alterar o valor de "indice1" para "abc", poderíamos usar:

tabelaTeste.a.indice1 = "abc"

Até aí tudo bem.

No meu caso, tenho uma tabela com 4 níveis, sendo que o último nível é o índice com o valor que deverá ser alterado em tempo de execução.

Neste caso, tentei fazer algo mais ou menos assim:

local tabelaTeste = {
  
  a = {
     indice1 = 123,
     indice2 = 456
  }

}


alteraIndice = function(referencia, estado)

referencia.indice1 = estado

for i, v in pairs(perfil.a.b) do
print (i,v)
end

end

start = function(referencia_da_tabela_enviada_pelo_server)

        -- @referencia_da_tabela_enviada_pelo_server: tabelaTeste['a']['b']

alteraIndice (referencia_da_tabela_enviada_pelo_server, 'abc')
end


Acontece que, no momento que o servidor for enviar a referência desta tabela, ele irá enviar uma string, como por exemplo, "tabelaTeste.a.indice1", argumento este que o Lua, quando receber, não irá entender como uma referência de tabela, o que não irá resultar na manipulação dos estados de seus índices.

Procurei resolver este problema de várias formas, mas até agora não consegui algo que fosse eficiente.

Alguém poderia me dar uma luz nessa situação?

Valeu!!

--
Você recebeu essa mensagem porque está inscrito no grupo "Lua BR" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para [hidden email].
Acesse esse grupo em https://groups.google.com/group/lua-br.
Para mais opções, acesse https://groups.google.com/d/optout.

--
Você recebeu essa mensagem porque está inscrito no grupo "Lua BR" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para [hidden email].
Acesse esse grupo em https://groups.google.com/group/lua-br.
Para mais opções, acesse https://groups.google.com/d/optout.
Reply | Threaded
Open this post in threaded view
|

Re: Dúvida com tabelas

Ulisses Piassa
Bom dia galera!

Eric, Tomas e Diego, valeu mesmo pelas idéias. tomas, tentei procurar a resposta que o Luiz já havia mandado, mas dentre tantas newsletter acabei não conseguindo encontrar, rs.

Ainda estou aprendendo a linguagem em seus pormenores, e analisar as implementações das mais complexas as mais simples me ajuda muito a entendê-la melhor.

Valeu pessoal!

[]'s

2016-08-22 19:14 GMT-03:00 Diego Nascimento <[hidden email]>:
Olá Ulisses,

Conheço o básico de lua, eu procuro adequar a estrutura do programa dentro do que eu sei fazer, eu não saberia como fazer o que você quer, mas eu faria de outra forma.

A tabela vai ser a mesma?? eu faria algo assim

-------------------------------------------------------------------------
local tabelaTeste = {  
  a = { indice1 = 123, indice2 = 456 },
  b = { indice1 = 1, indice2 = 55, indice3 = 12}
}

alteraIndice = function(tabela, referencia, estado)
local index_dot = string.find(referencia, '%.')
local ref1 = string.sub(referencia, 1, index_dot-1)
local ref2 = string.sub(referencia, index_dot+1, -1)

tabela[ref1][ref2] = estado
end

-- teste a.indice1
print(tabelaTeste.a.indice1)
alteraIndice(tabelaTeste, 'a.indice1', 'abc')
print(tabelaTeste.a.indice1)

-- teste b.indice3
print(tabelaTeste.b.indice3)
alteraIndice(tabelaTeste, 'b.indice3', 80)
print(tabelaTeste.b.indice3)

-------------------------------------------------------------------------

tenta criar uma tabela para ser padrão, se só houver uma tabela que será manipulada aih vc precisa só da posição do item a ser alterado, manipula a recebida com sub e find ou com patterns matching.

Eu realmente não sei como retornar o nome de uma tabela, ou converter uma string para uma tabela já existente.


Em 22 de agosto de 2016 16:09, Ulisses Piassa <[hidden email]> escreveu:
Boa tarde galera, tudo blz?

Estou tentando resolver a seguinte situação:

Tenho em ambiente de execução uma tabela gravada em RAM, que precisa ser atualizada com argumentos recebidos. Minha intenção era passar, nestes argumentos, a referência da tabela em memória e o novo valor que determinado índice deve assumir.

Vou tentar ilustrar aqui pra ficar mais claro. Imaginem uma tabela tabelaTeste = {}:

tabelaTeste = {
  
  a = {
     indice1 = 123,
     indice2 = 456
  }

}

Esta tabela é carregada em memória. Portanto, se quisermos alterar o valor de "indice1" para "abc", poderíamos usar:

tabelaTeste.a.indice1 = "abc"

Até aí tudo bem.

No meu caso, tenho uma tabela com 4 níveis, sendo que o último nível é o índice com o valor que deverá ser alterado em tempo de execução.

Neste caso, tentei fazer algo mais ou menos assim:

local tabelaTeste = {
  
  a = {
     indice1 = 123,
     indice2 = 456
  }

}


alteraIndice = function(referencia, estado)

referencia.indice1 = estado

for i, v in pairs(perfil.a.b) do
print (i,v)
end

end

start = function(referencia_da_tabela_enviada_pelo_server)

        -- @referencia_da_tabela_enviada_pelo_server: tabelaTeste['a']['b']

alteraIndice (referencia_da_tabela_enviada_pelo_server, 'abc')
end


Acontece que, no momento que o servidor for enviar a referência desta tabela, ele irá enviar uma string, como por exemplo, "tabelaTeste.a.indice1", argumento este que o Lua, quando receber, não irá entender como uma referência de tabela, o que não irá resultar na manipulação dos estados de seus índices.

Procurei resolver este problema de várias formas, mas até agora não consegui algo que fosse eficiente.

Alguém poderia me dar uma luz nessa situação?

Valeu!!

--
Você recebeu essa mensagem porque está inscrito no grupo "Lua BR" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para [hidden email].
Acesse esse grupo em https://groups.google.com/group/lua-br.
Para mais opções, acesse https://groups.google.com/d/optout.

--
Você recebeu essa mensagem porque está inscrito no grupo "Lua BR" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para [hidden email].
Acesse esse grupo em https://groups.google.com/group/lua-br.
Para mais opções, acesse https://groups.google.com/d/optout.

--
Você recebeu essa mensagem porque está inscrito no grupo "Lua BR" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para [hidden email].
Acesse esse grupo em https://groups.google.com/group/lua-br.
Para mais opções, acesse https://groups.google.com/d/optout.