Is Lua an Object Oriented language?
Archive - Originally posted on "The Horse's Mouth" - 2013-06-15 09:13:08 - Graham EllisWhat 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$