पूरी तरह से सटीक होने के लिए, के 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)
।