Difference between revisions of "Lua: Basic OO"

From Mario Fan Games Galaxy Wiki
m
m
 
Line 6: Line 6:
  
 
By using colon syntax, we can shorten the original function and make it somewhat more readable.
 
By using colon syntax, we can shorten the original function and make it somewhat more readable.
<source lang="lua">
+
<source lang="lua" enclose="div">
 
string.case = function (self)
 
string.case = function (self)
 
     local casetable = { }
 
     local casetable = { }
Line 26: Line 26:
 
This can be tested like so:
 
This can be tested like so:
  
  <source lang="lua">
+
  <source lang="lua" enclose="div">
 
print(table.concat(("This is a test. ABC 123 !!!"):case(), ", "))
 
print(table.concat(("This is a test. ABC 123 !!!"):case(), ", "))
  

Latest revision as of 01:42, 28 September 2009

Lua
Lua.gif
Basics
Intermediate
Advanced
XLua
Add to this template
 Standardwikimessagebox.png This article assumes the use of Lua 5.1.

Information may not be accurate or may need revision if you are using a different version.

 Stub.png This article or section is in need of expansion.

Please add further information.

Though Lua has no true class support, it is still possible to emulate object-oriented programming through various methods, usually metatables. Lua uses a special colon syntax to indicate methods, but regular dot syntax can be used instead; however, in the latter case you must remember to include the object to be affected as the first parameter!

Let's say we wanted to check a string for letter case, and return a table containing 'upper', 'lower', or 'n/a' for each character. Additionally, we want to add the function to the basic 'string' library, because it makes sense to do that seeing as it's a string operation. We could always use some function like string.case(str), which is fine, but we should take advantage of the fact that the 'string' library sets a metatable for strings; this is something Lua assumes we can't do (we can do it but it requires the 'debug' library... not something you want to supply with your program!).

By using colon syntax, we can shorten the original function and make it somewhat more readable.

string.case = function (self)
    local casetable = { }
    local casestr = ""
    for chr in self:gmatch("(.)") do
        if select(2, chr:gsub("(%u)", "%1")) == 1 then
            casestr = 'upper'
        elseif select(2, chr:gsub("(%l)", "%1")) == 1 then
            casestr = 'lower'
        else
            casestr = 'n/a'
        end
        table.insert(casetable, casestr)
    end
    return casetable
end

This can be tested like so:

print(table.concat(("This is a test. ABC 123 !!!"):case(), ", "))

--prints: upper, lower, lower, lower, n/a, lower, lower, n/a, lower, n/a, lower, lower, lower, lower, n/a, n/a, upper, upper, upper, n/a, n/a, n/a, n/a, n/a, n/a, n/a, n/a