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$
(written 2013-06-15)
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)
[3730] What is a metatable? How do I set one up? How do I use them? Lua - (2012-05-12)
[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)
Some other Articles
Has your Twitter feed stopped working? Switching to their new APIAmerican Circus in MelkshamMelksham - Flower TownWe not only teach PHP and Python - we teach good PHP and Python Practice!Is Lua an Object Oriented language?International Melksham - industry, and beautiful countrysideMore or less back - what happened to our server the other dayTeaching CodeIgniter - MVC and PHPWiltshire and Melksham Transport - what is going on?Really good friends - four in a bed!