In a recent article (
[here]), I asked if Lua was an object oriented language - and I concluded that it supports the OO paradigm very well, even though it doesn't have keywords like "class", "private" or "extends". At the end of that article, I mentioned
metatables - a subject I have carefully sidestepped so that I could show you the basics first. But Metatables are a vital piece of making Lua work "OO".
So - what is a metatable?
It's a table that you can add in to another ("regular" ?) table that adds members / characteristics to that original table - makes it do things differently.
For example, if you define a
__tostring method in a metatable, then set that as the metatable for a regular table, you'll change how Lua prints out that table. I've put an example showing the mechanism
[here].
How does a metatable work in an OO like way?
Let's have an example:
• set up a table that contains the common code for all objects of type "pet"
• set up a metatable that contains __string (and other stuff) which describes how a table that's set up to contain a pet performs its actions
• add a function (a constructor) which sets up another table for each time you call it - to contain all the data about a particular pety, and have that table reference the metatable just mentioned
You can then write common code to use pet objects ... the main application may be as simple as:
gypsy = pet.new("dog",28,3)
charles = pet.new("prince",95,60)
print (gypsy)
print (charles)
and it runs like this:
[trainee@holt lm10]$ lua metasmall
A pet of type dog aged 3 weighing 28
A pet of type prince aged 60 weighing 95
[trainee@holt lm10]$
The commented source showing you how to do that setup is
[here].
How do I override operators?
The effect of adding a Gypsy to a Prince is a muddy mess - any you would like to do that using the "+" operator.
In Lua, you can override the standard operators for a table using functions such as
__add in their metatable.
Add the code
ff = gypsy + charles
print (ff)
onto the end of the previous example, and run it:
[trainee@holt lm10]$ lua metapetite
A pet of type dog aged 3 weighing 28
A pet of type prince aged 60 weighing 95
Muddy mess
[trainee@holt lm10]$
The full code (showing the addition of the __add function) is
[here]
Can I user methods to a series of tables?
The examples so far have overridden the behaviour of operators and standard functionallity - but you can also add your own. If you call a function that does not exist on a table, the
__index function within its metatable is called up to resolve what code is to be run.
The first parameter to __index is the table on which the method is being called, and the second parameter is the name of the function needed. The __index method should return the function that's to be run (very often, that will be a function in the metatable itself, or in the pet table), or a nil if the requested function does not exist.
There's an example
[here] - adding a
getliftable method which returns a true or false value. The calling code looks like this:
gypsy = pet.new("dog",28,3)
charles = pet.new("prince",95,60)
family = {gypsy, charles}
for _,v in ipairs(family) do
print (v)
if v:getliftable() then
print ("Can lift ")
else
print ("is very heavy")
end
end
And when you run it, you get
[trainee@holt lm10]$ lua metamid
A pet of type dog aged 3 weighing 28
Can lift
A pet of type prince aged 60 weighing 95
is very heavy
[trainee@holt lm10]$
How does it decide whether to return true or false? Ah - that's the beauty of
encapsulation which hides code within a set of fuctions that the higher level user calls.
Does getliftable always runs the same code? Not necessarily - if you had not only pets but also some other type of tables, Lua will select the appropriate code to run depending on the data type. That's
polymorphism.
So - although you don't have all the usual keywords associated with an OO language, you do have the key feature / benefits - encapsulation, polymorphism, separation of detailed code for higher level user (I need to add some "local" declarations for better partitioning!) ... so I'm going to say - with confidence - that you can write code using OO techniques in Lua.
(written 2010-04-02)
Associated topics are indexed as below, or enter http://melksh.am/nnnn for individual articles
U107 - Object Orientation - the Lua way [1692] Towards Object Oriented Programming in Lua - (2008-06-30)
[1699] If you are learning Lua, here are some more examples - (2008-07-06)
[1743] First class functions in Lua lead to powerful OO facilities - (2008-08-07)
[1819] Calling base class constructors - (2008-10-03)
[2318] For Lua Programmers AND for Town Planners - (2009-08-02)
[2359] A fresh example - objects the Lua way - (2009-08-13)
[2455] Lua examples - coroutines, error handling, objects, etc - (2009-10-15)
[2701] Is Lua an Object Oriented language? - (2010-04-01)
[2710] __index and __newindex in Lua - metatable methods - (2010-04-05)
[3142] Private and Public - and things between - (2011-01-22)
[3396] Tables as Objects in Lua - a gentle introduction to data driven programming - (2011-08-17)
[3524] Metaclasses (Python) and Metatables (Lua) - (2011-11-17)
[3683] Weak references in Lua - what are they, and why use them? - (2012-04-04)
[3694] Special __ methods you can use in Lua metatables - (2012-04-12)
[3727] Using Lua tables as objects - (2012-05-11)
[3730] What is a metatable? How do I set one up? How do I use them? Lua - (2012-05-12)
[4117] Is Lua an Object Oriented language? - (2013-06-15)
[4248] Metatables, Metamethods, classes and objects in Lua - (2014-03-18)
[4273] Dot or Colon separator between table name and member in Lua - what is the difference? - (2014-05-06)
[4572] Tables with values and code in Lua - looks like an object? - (2015-11-05)
[4573] Classic style OO code - in Lua - (2015-11-05)
[4753] Lua, Tcl, Python, C and C++ courses - at our Melksham HQ or on your site - forward from July 2017 - (2017-07-02)
U105 - Lua - Tables and the table library. [1697] Sorting in lua - specifying your own sort routine - (2008-07-05)
[1742] Lua - Table elements v table as a whole - (2008-08-07)
[2346] The indexed and hashed parts of a Lua table - (2009-08-10)
[2499] ourdog is Greyhound, Staffie and Ginger Cake - (2009-11-09)
[2699] Lua tables - they are everything - (2010-03-30)
[3725] Lua Tables - (2012-05-10)
[4571] Lua - using modules to add your own utilities - (2015-11-04)
Some other Articles
A walk on the Kennet and AvonError trapping in Lua - no exceptions.Hotel booking in Melksham made easy!A walk within without - Melksham WithoutLua MetatablesFirst and last match with Regular ExpressionsThe same very simple program in many different programming languagesRuth Davis, 1916 - 2010