Muito importante a mensagem que o Tomas escreveu. Por favor, para
resolver o problema, leiam Programming in Lua, Chapter 5 - Functions,
p35. Experimentem o seguinte código:
pessoa = { nome = "Fulano Beltrano", idade = 34 }
email = "
fb...@algum.com"
function mostre(t, e)
print(t, e)
for k, v in pairs(t) do
print(("%10s: %s"):format(k,v))
end
end
function atualize(t, e)
-- t é uma tabela global
t.nascimento = "1978-10-08"
t.nome = "Hallison Batista"
e = "
ti...@var.org"
print(t, e)
end
function apague(t, e)
-- altera o conteúdo da variável local t, mas t global não é alterada, pois
-- todo escopo dentro de uma função é local.
t, e = nil, nil
end
print "pessoa"
mostre(pessoa, email)
print "----------"
-- pessoa
-- table: 0x1b0a210
fb...@algum.com
-- nome: Fulano Beltrano
-- idade: 34
-- ----------
print "atualizando pessoa"
atualize(pessoa, email)
mostre(pessoa, email)
print "----------"
-- atualizando pessoa
-- table: 0x1b0a210
ti...@var.org
-- table: 0x1b0a210
fb...@algum.com
-- nome: Hallison Batista
-- idade: 34
-- nascimento: 1978-10-08
-- ----------
print "apagando pessoa"
apague(pessoa, email)
print "----------"
-- apagando pessoa
-- ----------
print "resultado"
mostre(pessoa, email)
print "----------"
-- resultado
-- table: 0x1b0a210
fb...@algum.com
-- nome: Hallison Batista
-- idade: 34
-- nascimento: 1978-10-08
-- ----------
Observem que a variável email não foi alterada devido ao escopo, mas a
tabela (que possui um escopo próprio) foi alterada.
2012/5/7 Tomas Guisasola Gorham <
to...@tecgraf.puc-rio.br>:
> Oi pessoal
>
> Acho que a confusão é mais de terminologia: parece que alguns
> termos estão sendo usados de formas diferentes. Espero não aumentar o
> problema com esta mensagem :-)
> Pelo que eu entendo, em Lua só há passagem por valor, ou seja,
> os parâmetros em uma chamada de função são copiados na pilha antes do
> desvio ser feito. Portanto, a função chamada não tem acesso às variáveis
> do chamador, eliminando a chance de efeito colateral sobre estas variáveis.
> Por outro lado, em Lua, alguns tipos não são manipulados como
> valores, como é o caso das tabelas. A criação de uma tabela produz uma
> referência para este valor, que é o que se atribui a uma variável.
> Juntando-se essas duas características, podemos ter um efeito
> semelhante ao de passagem por referência. Quando uma tabela é parâmetro
> de uma chamada de função, o valor da variável que se refere a esta
> tabela é copiado antes da chamada (passagem por valor), portanto a função
> chamada recebe uma cópia da referência, então tem acesso à mesma tabela.
> A tabela em si não é copiada. Entretanto, a função não pode alterar a
> variável (do chamador) que aponta para esta tabela.
>
> t = {} -- t é uma referência para uma nova tabela
> u = t -- u é uma cópia de t; ambas referenciam a mesma tabela
> u[1] = 2 -- t[1] == 2 !!!
>
> f(t) -- f pode alterar o conteúdo da tabela referenciada por t
> assert(t==u) -- mas f não pode alterar o valor de t
>
> Abraços,
> Tomás
>
>
> On Mon, 7 May 2012, Lourival Vieira Neto wrote:
>
>> 2012/5/6 Eric Chiesse <
echi...@gmail.com>:
>>>
>>> Lourival, coloquei meus comentários em linha.
>>>>>>> Em particular a função:
>>>>>>>
>>>>>>> function erase(t)
>>>>>>> t = nil
>>>>>>> end
>>>>>>>
>>>>>>> não vai anular a tabela no escopo externo à função erase (o que
>>>>>>> ocorreria se
>>>>>>> ela fosse passada por referência).
>>>>>>
>>>>>>
>>>>>> Não, isso não ocorreria se a tabela fosse passada como referência.
>>>>>
>>>>>
>>>>>
>>>>> Não entendi bem o que você quis dizer aqui (acho que você se confundiu
>>>>> com o
>>>>> texto). (...)
>>>>
>>>>
>>>> O que eu quis dizer foi: caso a tabela fosse passada por referência (o
>>>> que de fato ocorre),
>>>
>>>
>>>
>>> agora entendi o que vc disse.
>>>
>>>>
>>>> ela não seria anulada caso a variável que a
>>>> referencia dentro do escopo da função fosse anulada. "t = nil"
>>>
>>> (...)
>>>
>>> O que você colocou acima não faz sentido. (...)
>>
>>
>> Voce pode explicitar o que exatamente nao faz sentido? Acho que voce
>> esta' confundindo a passagem da tabela com a passagem da variavel. O
>> meu ponto e': tabelas em Lua sao passadas (e tambem atribuidas) por
>> referencia. Nao existe copia de tabelas na passagem de parametros (ou
>> na atribuicao de variaveis). Em nenhum momento argumentei quanto a
>> passagem de variaveis serem por referencia. Nao e' este o meu ponto. O
>> meu ponto e' quanto ao objeto ou tipo de dado em si, e nao a respeito
>> da variavel que armazena uma referencia para esse tipo. Caso seja
>> complicado dissociar o objeto da variavel que o referencia, pense no
>> seguinte exemplo (sem a necessidade de um quadro negro =p): "function
>> f(t) end f{}".
>>
>>> Quando a passagem é por referência sempre há efeitos colaterais no
>>> chamador no caso de uma atribuição, o que
>>> não ocorre em Lua. (...)
>>
>>
>> Em nenhum momento questionei a sua definicao (ou qualquer outra) de
>> "call-by-reference". Nao estou discutindo isto nem pretendo.
>>
>>> Mas enfim, não quero brigar nem entrar numa flame por conta disso. (...)
>>
>>
>> Tambem nao quero provocar nenhum flame; caso isto tenha parecido, nao
>> foi a minha intencao.
>>
>>
>
> --
>
--
Hallison Batista
hallison...@gmail.com