Os dois pontos é usado para passar a própria tabela, de onde a função está sendo chamada, como parâmetro o implícito de nome self, permitindo que dentro da função, sejam acessados os campos da tabela que a chamou.
local calc = {a = 2, b = 3}
--usando : na definicao da funcao, é criado um parâmetro implicito self
--que deverá receber a tabela que está chamando a funcao.
function calc:soma()
return self.a + self.b
end
--aqui não se usou : e o efeito é o mesmo,
--mas neste caso, para acessar o self, é preciso declará-lo
--explicitamente
function calc.subtrai(self)
return self.a - self.b
end
--definida com ponto e sem o parâmetro self explícito,
--logo, só faz sentido chamá-la com ponto, senão
--a tabela chamadora seria passada para o parâmetro a
function calc.inverte_sinal(a)
return -a
end
--chama soma, passando calc implicitamente para o parâmetro self (também implícito)
print(calc:soma())
calc.a = 3
calc.b = 4
--independente de soma ter sido definida com dois-pontos ou ponto,
--pode-se chamá-la das duas formas (exceto no último exemplo logo abaixo).
--aqui, é usado ponto, logo, é preciso passar
--a tabela calc (que tá chamando a soma) para a funcao soma
print(calc.soma(calc))
--o mesmo ocorre com subrai, independente de como foi definida,
--pode-se chamar com dois-pontos ou ponto.
--Como foi definida com ponto e possui o parâmetro self,
--a chamada com ponto deve incluir a tabela chamadora
print(calc.subtrai(calc))
--subtrai foi definida com ., mas inclui o parâmetro self explicitamente,
--logo, a chamada com dois-pontos passará a tabela calc para este parâmetro
print(calc:subtrai())
--Como inverte_sinal foi definida com ponto e sem o self, e possui um parâmetro(s)
--neste caso, não se pode usar dois-pontos, senão, o valor de self seria
--passado ao primeiro parâmetro, no caso o "a"
print(calc.inverte_sinal(1))
Eu estava lendo o Manual do lua 5.1, e acabei não entendendo muito bem