Sample code:
function Account:new (o)
o = o or {} -- create object if user does not provide one
setmetatable(o, self)
self.__index = self
return o
end
taken from "Object-Oriented Programming: Classes" http://www.lua.org/pil/16.1.html
What is the purpose of the self.__index = self
line? And why is it executed every time an object is created?
As others have said, self
(the Account
table) is used as a metatable assigned to the objects created using new
. Simplifying slightly (more info available at the links provided) when a field is not found in 'o', it goes to the 'Account' table because o's metatable says to go to Account (this is what __index
does).
It does not, however, need to be executed every time an object is created. You could just as easily stick this somewhere:
Account.__index = Account
and it would work as well.
The somewhat longer story is that if an object o
has a metatable, and that metatable has the __index
field set, then a failed field lookup on o
will use __index
to find the field (__index
can be a table or function). If o
has the field set, you do not go to its metatable's __index
function to get the information. Again, though, I encourage you to read more at the links provided above.