Search code examples
classooplua

programming in lua, objects


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?


Solution

  • 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.