Spaces:
Paused
Paused
| -- Module definition | |
| local Example = {} | |
| -- Constants | |
| local MAX_RETRIES = 3 | |
| local DEFAULT_TIMEOUT = 5000 | |
| -- Private functions (local) | |
| local function validateInput(input) | |
| if type(input) ~= "string" then | |
| error("Input must be a string") | |
| end | |
| return true | |
| end | |
| -- Metatable for creating classes | |
| local function createClass(name) | |
| local cls = {} | |
| cls.__index = cls | |
| cls.__name = name | |
| -- Constructor | |
| function cls.new(...) | |
| local self = setmetatable({}, cls) | |
| if self.init then | |
| self:init(...) | |
| end | |
| return self | |
| end | |
| return cls | |
| end | |
| -- Class definition using metatables | |
| local User = createClass("User") | |
| function User:init(name, age) | |
| self.name = name | |
| self.age = age | |
| self.created_at = os.time() | |
| end | |
| function User:toString() | |
| return string.format("User(%s, %d)", self.name, self.age) | |
| end | |
| -- Table with custom metamethods | |
| local DataStore = { | |
| data = {}, | |
| __newindex = function(t, k, v) | |
| print("Setting value:", k, v) | |
| rawset(t.data, k, v) | |
| end, | |
| __index = function(t, k) | |
| return t.data[k] | |
| end | |
| } | |
| setmetatable(DataStore, DataStore) | |
| -- Coroutine example | |
| local function producer() | |
| return coroutine.create(function() | |
| for i = 1, 5 do | |
| coroutine.yield(i) | |
| end | |
| end) | |
| end | |
| -- Iterator function | |
| local function range(from, to, step) | |
| step = step or 1 | |
| local i = from - step | |
| return function() | |
| i = i + step | |
| if i <= to then | |
| return i | |
| end | |
| end | |
| end | |
| -- Module functions | |
| function Example.process(input) | |
| assert(validateInput(input)) | |
| local result = { | |
| original = input, | |
| processed = string.upper(input), | |
| timestamp = os.time() | |
| } | |
| return result | |
| end | |
| -- Function with multiple returns | |
| function Example.divide(a, b) | |
| if b == 0 then | |
| return nil, "Division by zero" | |
| end | |
| return a / b | |
| end | |
| -- Closure example | |
| function Example.counter(initial) | |
| local count = initial or 0 | |
| return function() | |
| count = count + 1 | |
| return count | |
| end | |
| end | |
| -- Table manipulation | |
| function Example.merge(t1, t2) | |
| local result = {} | |
| for k, v in pairs(t1) do | |
| result[k] = v | |
| end | |
| for k, v in pairs(t2) do | |
| result[k] = v | |
| end | |
| return result | |
| end | |
| -- Pattern matching example | |
| function Example.extractEmails(text) | |
| local emails = {} | |
| for email in string.gmatch(text, "[%w%.%-_]+@[%w%.%-_]+%.%w+") do | |
| table.insert(emails, email) | |
| end | |
| return emails | |
| end | |
| -- Event handling system | |
| local EventEmitter = createClass("EventEmitter") | |
| function EventEmitter:init() | |
| self.handlers = {} | |
| end | |
| function EventEmitter:on(event, handler) | |
| self.handlers[event] = self.handlers[event] or {} | |
| table.insert(self.handlers[event], handler) | |
| end | |
| function EventEmitter:emit(event, ...) | |
| if self.handlers[event] then | |
| for _, handler in ipairs(self.handlers[event]) do | |
| handler(...) | |
| end | |
| end | |
| end | |
| -- Add classes to module | |
| Example.User = User | |
| Example.EventEmitter = EventEmitter | |
| -- Module return | |
| return Example | |