Home Accessibility Courses Twitter The Mouth Facebook Resources Site Map About Us Contact
 
For 2023 (and 2024 ...) - we are now fully retired from IT training.
We have made many, many friends over 25 years of teaching about Python, Tcl, Perl, PHP, Lua, Java, C and C++ - and MySQL, Linux and Solaris/SunOS too. Our training notes are now very much out of date, but due to upward compatability most of our examples remain operational and even relevant ad you are welcome to make us if them "as seen" and at your own risk.

Lisa and I (Graham) now live in what was our training centre in Melksham - happy to meet with former delegates here - but do check ahead before coming round. We are far from inactive - rather, enjoying the times that we are retired but still healthy enough in mind and body to be active!

I am also active in many other area and still look after a lot of web sites - you can find an index ((here))
What is a metatable? How do I set one up? How do I use them? Lua

What is a metatable?

In Lua, you can hold a whole bundle of information about something in a table, which gives you a convenient "handle" to that information - be that information in the form of values, or behaviours (i.e. conventional variable of code). This is illustrated in earlier articles on Lua Tables and on Using Lua tables as objects.

Let's look a stage further. As well as unique pieces of information associated with a particular table / object, you'll want to have common members - pieces of code that run on every table of a certain type (in OO terminology, that's methods that can be run on every member of a class). And this is where Lua Metatables come in.

A metatable is itself a table that contains variables and code. It can be linked into / called up from any other table (a parent table, if you like) by using the setmetatable function. And once that metatable has been set, references made to members that do not exist in the main (parent) table will be passed on to the metatable. This isn't actually a one-to-one mapping - making it a bit harder for me to explain, but much more flexible when I come to use it.

Let's take a look at the standard behaviour of a table:

  function newtrain(length) -- set up objectish table
    local newone = {}
    newone.cars = length
    return newone
  end
  
  southampton = newtrain(2)
  cheltenham = newtrain(3)
  
  print (southampton, cheltenham) -- just prints address


And here's the output:

  munchkin:lm12 grahamellis$ lua kitten
  table: 0x100106bb0 table: 0x100106c20
  munchkin:lm12 grahamellis$


Sample code - [here]

How do I create a Metatable?

Let's now say that I want ALL the tables created by the newtrain function to print out nicely, and I also want the abiity to define how to add such table togethers. Rather than define all the extra functinallity lots of times, in Lua I can define a metabable and then say (in a single call for each of my parent tables) that the train tables all behave in the way defined in my metatable. Let's take a look at how that works:

Firstly, I'll create a table (just an ordinary table) which I'm going to use for my additional functionallity.

  demo_metatable = {}

I'll then add some code that's to be shared to that table:

  function demo_metatable.__add(this, that)
    local newone = {}
    newone.cars = this.cars + that.cars
    setmetatable(newone, demo_metatable) -- so that we can piggyback additions
    return newone
  end
 
  function demo_metatable.___tostring(this)
    return "A train of " .. this.cars .. " carriages"
  end


And finally I'll call up that table in my newtrain function as its metatable

  function newtrain(length)
    local newone = {}
    newone.cars = length
    setmetatable(newone, demo_metatable) -- so that we add them
    return newone
  end


How do I use a Metatable?

Any tables that I now create via the newtrain function will be "tuned" with the features of the metatable called demo_metatable ... adding together two tables (using the + operator) has been defined as producing a new table with "cars" members added, and I've also defined how to print such tables.

So I can now write some code to use these functions and the metatable:

  southampton = newtrain(2)
  cheltenham = newtrain(3)
  service = southampton + cheltenham
  print (southampton, cheltenham, service)


and the behaviour is modified by the __add function so we don't get:

  lua: tabby:27: attempt to perform arithmetic on global 'southampton' (a table value)
  stack traceback:
    tabby:27: in main chunk
    [C]: ?
  munchkin:lm12 grahamellis$


but rather an addition is performed, and our printouts saying:

  table: 0x100106c20

are replaced by the output from __tostring:

  munchkin:lm12 grahamellis$ lua tabby
  A train of 2 carriages A train of 3 carriages A train of 5 carriages
  munchkin:lm12 grahamellis$


Sample code [here]

Adding elements of other names to a metatable

What if I want to add another name of my own choice to every table of a certain type? I can do it, but not directly by adding that name to the metatable. Instead, I have to provide a function called __index in the metatable, which can then branch out and act as appropriate.

So if i want this to work:

  for _,v in pairs(options) do
    print (v, v:getlength(), v.bums, v.capacity, v.earlobes)
  end


I might add the following to add the required extra definitions to the metatable:

  function demo_metatable.__index(whichmaintable,whatcalled)
    if (whatcalled == "getlength") then return demo_metatable.glen end
    if (whatcalled == "bums") then return whichmaintable.cars * 73 end
    if (whatcalled == "capacity") then return math.floor(whichmaintable.bums * 1.4) end
    return "teabag" -- default
  end
  
  function demo_metatable.glen(source)
    return (source.cars * 23)
  end


Sample code [here]

(written 2012-05-12, updated 2012-05-13)

 
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)
  [2703] Lua Metatables - (2010-04-02)
  [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)
  [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)


Back to
Then and now pictures of Melksham - on show through the summer
Previous and next
or
Horse's mouth home
Forward to
Now Open - A Museum for Melksham. Come in and see us.
Some other Articles
QR codes with marketing logos embedded
More hazards of modern life
Ten more visitors to your premises every day?
Now Open - A Museum for Melksham. Come in and see us.
What is a metatable? How do I set one up? How do I use them? Lua
Then and now pictures of Melksham - on show through the summer
The future needs for rail services to Melksham - change needed; current service an insult
Press Release - Museum to explore the story of Melksham
Lua Tables
4759 posts, page by page
Link to page ... 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96 at 50 posts per page


This is a page archived from The Horse's Mouth at http://www.wellho.net/horse/ - the diary and writings of Graham Ellis. Every attempt was made to provide current information at the time the page was written, but things do move forward in our business - new software releases, price changes, new techniques. Please check back via our main site for current courses, prices, versions, etc - any mention of a price in "The Horse's Mouth" cannot be taken as an offer to supply at that price.

Link to Ezine home page (for reading).
Link to Blogging home page (to add comments).

You can Add a comment or ranking to this page

© WELL HOUSE CONSULTANTS LTD., 2024: 48 Spa Road • Melksham, Wiltshire • United Kingdom • SN12 7NY
PH: 01144 1225 708225 • EMAIL: info@wellho.net • WEB: http://www.wellho.net • SKYPE: wellho

PAGE: http://www.wellho.net/mouth/3730_Wha ... m-Lua.html • PAGE BUILT: Sun Oct 11 16:07:41 2020 • BUILD SYSTEM: JelliaJamb