Hoàn toàn chính xác, obj:method(1, 2, 3)
giống như
do
local _obj = obj
_obj.method(_obj, 1, 2, 3)
end
Tại sao biến cục bộ? Bởi vì, như nhiều người đã chỉ ra, obj:method()
chỉ lập chỉ mục _ENV
một lần để có được obj
. Điều này thường chỉ quan trọng khi xem xét tốc độ, nhưng xem xét tình huống này:
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
Bây giờ hãy tưởng tượng __index
metamethod đã làm nhiều hơn là chỉ in một cái gì đó. Hãy tưởng tượng nó tăng một bộ đếm, ghi lại một cái gì đó vào một tập tin hoặc xóa một người dùng ngẫu nhiên khỏi cơ sở dữ liệu của bạn. Có một sự khác biệt lớn giữa việc làm điều đó hai lần hoặc chỉ một lần. Trong trường hợp này, có một sự khác biệt rõ ràng giữa obj.method(obj, etc)
và obj:method(etc)
.