Para ser completamente preciso, obj:method(1, 2, 3)
é o mesmo que
do
local _obj = obj
_obj.method(_obj, 1, 2, 3)
end
Por que a variável local? Porque, como muitos apontaram, obj:method()
apenas os índices são obtidos _ENV
uma vez obj
. Isso normalmente é importante ao considerar a velocidade, mas considere esta situação:
local tab do
local obj_local = { method = function(self, n) print n end }
tab = setmetatable({}, {__index = function(idx)
print "Accessing "..idx
if idx=="obj" then return obj_local end
end})
end
tab.obj.method(tab.obj, 20)
--> Accessing obj
--> Accessing obj
--> 20
tab.obj:method(10)
--> Accessing obj
--> 10
Agora imagine que o __index
metamétodo fez mais do que apenas imprimir algo. Imagine que ele aumentou um contador, registrou algo em um arquivo ou excluiu um usuário aleatório do seu banco de dados. Há uma grande diferença entre fazer isso duas ou apenas uma vez. Nesse caso, há uma clara diferença entre obj.method(obj, etc)
e obj:method(etc)
.