Якщо бути абсолютно точним, obj:method(1, 2, 3)
це те саме, що
do
local _obj = obj
_obj.method(_obj, 1, 2, 3)
end
Чому локальна змінна? Тому що, як багато хто зазначав, отримати obj:method()
лише індекси _ENV
один раз obj
. Зазвичай це важливо, враховуючи швидкість, але враховуйте цю ситуацію:
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
А тепер уявіть, що __index
метаметод зробив більше, ніж просто щось надрукувати. Уявіть, що вона збільшила лічильник, записала щось у файл або видалила випадкового користувача зі своєї бази даних. Існує велика різниця між тим, що робити це двічі або лише один раз. У цьому випадку існує чітка різниця між obj.method(obj, etc)
та obj:method(etc)
.