Untuk sepenuhnya tepat, obj:method(1, 2, 3)
sama dengan
do
local _obj = obj
_obj.method(_obj, 1, 2, 3)
end
Mengapa variabel lokal? Karena, seperti yang telah ditunjukkan banyak orang, obj:method()
hanya indeks yang _ENV
mendapatkan sekali obj
. Ini biasanya hanya penting ketika mempertimbangkan kecepatan, tetapi pertimbangkan situasi ini:
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
Sekarang bayangkan __index
metametode melakukan lebih dari sekedar mencetak sesuatu. Bayangkan itu meningkatkan penghitung, mencatat sesuatu ke file atau menghapus pengguna acak dari database Anda. Ada perbedaan besar antara melakukan itu dua kali atau hanya sekali. Dalam hal ini, ada perbedaan yang jelas antara obj.method(obj, etc)
dan obj:method(etc)
.