OOP in Lua
This template is no longer in use as it results in poor readability.
This is a scripting tutorial teaches you the basics about how to start using an Object-Oriented developing interface with Lua.
Glossary
- environment: either a table or an array containing values.
- self: predefined variable referring to the environment within which we are executing the code.
Initialising
There is a basic and simple predefined variables we should recognize and know: self.
Our first environment
local array = {} function array:example (argument) return "Hello" end
What we do upon above is defining a local environment and then declaring the function example as part of it. Alright, so how should we proceed in order to call the mentioned function? As follows:
array:example() array.example(array, example)
As Lua is so cool, we're able to call a function using two methods: ":" and ".". As you can see on the example above, if we use a dot we're supposed to send self's value to the function. Yes, that's right, and in case we use a colon, self's value will be the environment within which we are executing a code, i.e. array. We can send the self value in case we want a function to override its self and, instead of working as if self was the environment within it's working, it will work over the environment we sent (example under advanced examples).
Variables and further handling
local array = {text = "none"} function array:setKey (key, value) self[key] = value end function array:getKey (key) return self[key] end array:getKey("text") -- returns "none" array:setKey("text", "something") -- sets "text"'s value to 'something' array:getKey("text") -- returns "something"
What we do here is retrieving and modifying text's value, which a variable inside array, recurring to functions inside the same environment as the variable is.
Metatables
Everything you need to know about them is stupendously explained here.
Advanced examples
Overriding self's value:
local array = {text = "none"} local array2 = {text = "none2"} function array:setKey (key, value) self[key] = value end function array:getKey (key) return self[key] end array.getKey(array2, "text") -- returns "none2" array.setKey(array2, "text", "something2") -- sets array2's "text" value to 'something2' array.getKey(array2, "text") -- returns "something" array:getKey("text") -- returns "none" array.getKey(array, "text") -- same as above
A simple backpacks example:
local backpack = {list = {}} function backpack:create (owner, slots) if self.list[owner] then return end -- return false in case this player already owns a backpack local new = { items = {}, slots = slots or 100, owner = owner } setmetatable(new.items, { __newindex = function(table, key, value) -- this is called once a new value/item is added into the player's table/backpack if #table >= new.slots then return end -- return false in case there isn't any free slot left return rawset(table, key, value) end } ) self.list[owner] = new end function backpack:addItem (player, item, value) if not self.list[player] then return end self.list[player][item] = value end