เพื่อความแม่นยำอย่างสมบูรณ์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)