Para ser completamente preciso, obj:method(1, 2, 3)
es lo mismo que
do
local _obj = obj
_obj.method(_obj, 1, 2, 3)
end
¿Por qué la variable local? Porque, como muchos han señalado, obj:method()
solo indexa _ENV
una vez para obtener obj
. Esto normalmente solo es importante cuando se considera la velocidad, pero considere esta situación:
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
Ahora imagine que el __index
metametodo hizo más que simplemente imprimir algo. Imagine que aumenta un contador, registra algo en un archivo o elimina un usuario aleatorio de su base de datos. Hay una gran diferencia entre hacerlo dos veces o solo una vez. En este caso, hay una clara diferencia entre obj.method(obj, etc)
y obj:method(etc)
.