Main Content

Is Lua an Object Oriented language?

Archive - Originally posted on "The Horse's Mouth" - 2013-06-15 09:13:08 - Graham Ellis

What makes an "Object Oriented Language"? Well - there are certain features you need, such as references, type handing, inheritance support and polymorphism if you're going to write code in a completely OO way, but there are also ways of following the OO paradigm in significant parts with just about any language. Looking back 30 years, I was using what are essentially OO techniques in Fortran.

Much of the week just passed, I was running a Lua course. You'll not find any class keyword, nor any extends ... but you will find tables that let you set the characteristics of data sets, and metatables which let you share a bundle of characteristics, including operator overloading, between a whole series of such tables. "The philosophy of object orientation by the back door". And it's really clever how it's done - a Lua download is only about 2% (yes, that's 2% not 20%) of the size of a Python download - so it's a really compact language. It may be missing 98% of the size, but when you use it you feel you're only missing 20% of the facilities - and many of those you can easily write from first principles.

There's an example of non-OO code in Lua - written by a delegate [here]. For a one-off job, that works well enough (and, let's face it, on a course the exercises are one-offs.). The code for handling the detail of the data is all mixed in with the main application, and the splitting out of specific fields is somewhat repetitive coding. We took the example and refactored elements of it - [here]; the new code is actually a bit shorter, even though there are more comments in it, and it's split into a series of tables (every collection in Lua is a table!) some of which are "stations" containing the data for an individual railway station, with another table containing the code needed to split up data lines in general; we can re-use that part in another application.

In my refactored example, you'll find very much OO style...

  while true do
    line = fh:read()
    if line == nil then break end
    thisStationInfo = Station.factory(line)
    mystations[#mystations+1] = thisStationInfo
    end


and

  for k,v in ipairs(mystations) do
    if v.Year_data[#v.Year_data] ~= "NULL" then
      pass = tonumber(v.Year_data[#v.Year_data])
      if pass < 1000 then
        print("station", v.fnme, "had", pass, "pasengers")
      end
    end
  end


View the data file [here] - download it from [here] - it's tab delimied, and cutting and pasting the viewed version won't work. If you're running the initial version of the code, note also that there's a difference in there between tabs and spaces. Fixed on the refactor ;-)

  munchkin:lj13 grahamellis$ lua shortplatform
  opening railstats.xyz for read
  railstats.xyz closed
  station Polesworth had 276 pasengers
  station Pilning had 166 pasengers
  station Nethertown had 536 pasengers
  station Shippea Hill had 942 pasengers
  station Ince & Elton had 296 pasengers
  station Stanlow & Thornton had 490 pasengers
  station Balmossie had 804 pasengers
  station Barry Links had 90 pasengers
  station Golf Street had 190 pasengers
  station Tees-Side Airport had 68 pasengers
etc
  station Hopton Heath had 680 pasengers
  station Doleham had 628 pasengers
  station Three Oaks had 532 pasengers
  station Winchelsea had 974 pasengers
  station Lelant Saltings had 622 pasengers
  station Lelant had 324 pasengers
  station Quintrel Downs had 974 pasengers
  munchkin:lj13 grahamellis$