Em geral esse erro acontece por causa da definição da função que não
possui o parâmetro self.
Em geral, você deve definir as funções e usá-las da seguinte forma:
t = {}
function t.foo(self, a)
--faz algo com self e a
end
t.foo(t, 'a') -- precisa passar a tabela como parâmetro.
No entanto, Lua oferece a facilidade sintática ':', que
automaticamente adiciona o self como primeiro parâmetro. O código
anterior é equivalente a:
t = {}
function t:foo(a)
--faz algo com self e a (self é colocado como parâmetro implicitamente).
end
t:foo('a') -- t é passado implicitamente como primeiro parâmetro (para self).
Espero ter ajudado. Abraço!
--
NI!
Esse código roda aqui sem problemas além do fato de faltar os
parênteses em 'self:exemplo_funcao'.
Não estou entendendo seu erro.
O 'self' só pode ser chamado de dentro de uma função que foi declarada
com self de parâmetro explicitamente (function bar.foo(self) end) ou
implicitamente com o uso de ':' (function bar:foo() end).
Você teria como colocar aqui a definição da função que dá problema?
--
NI!
Quando você chama funcoes[op](), você está executando a função
escolhida sem passar nenhum argumento. Então, na execução da função
escolhida, o parâmetro self é nil e, por isso, dá o erro.
Colocando funcoes[op](self), você passa o valor de self da função
Agenda.opcoes (que, no caso, quando chamada a partir de new, é a
tabela Agenda) para a função escolhida pelo usuário.
Uma nota à parte: em Lua, ao contrário de muitas linguagens OO, o self
não possui nenhum significado especial; você pode chamá-lo do que
quiser e passar qualquer valor. No entanto, convenciona-se (e o
syntatic sugar ':' usa essa convenção) de que, quando se deseja passar
a própria tabela que guarda a função como primeiro parâmetro,
colocamos o nome 'self'.
Espero ter ajudado.
Abs!
--
NI!
Se sim, voce nao pode substituir '.' por ':'. Os dois pontos sao
syntatic sugar para *chamadas* ou *definicoes* de funcoes. Ou seja,
ele coloca um parametro self na definicao da funcao ou joga a tabela
como primeiro argumento na chamada da funcao.
O que voce esta fazendo ali eh passar as funcoes propriamente ditas
(referencia a elas), mas voce nao as esta chamando. Voce so as chama
mais tarde em funcoes[op](self) e, por isso, voce precisa desse self.
Abs!
> --
> Lua BR - http://groups.google.com/group/lua-br
>
--
Sent from my mobile device
NI!