Tamamen hassas olması için, obj:method(1, 2, 3)
aynı
do
local _obj = obj
_obj.method(_obj, 1, 2, 3)
end
Neden yerel değişken? Çünkü, birçok kişinin belirttiği gibi, obj:method()
sadece bir _ENV
kez indeksler obj
. Bu normalde hızı dikkate alırken önemlidir, ancak bu durumu göz önünde bulundurun:
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
Şimdi __index
metamethod'un bir şey yazdırmaktan daha fazlasını yaptığını düşünün . Bir sayacı artırdığını, bir dosyaya bir şey kaydettiğini veya rastgele bir kullanıcıyı veritabanınızdan sildiğini düşünün. Bunu iki kez veya sadece bir kez yapmak arasında büyük bir fark var. Bu durumda obj.method(obj, etc)
ve arasında açık bir fark vardır obj:method(etc)
.