Функции


-- Функции могут быть локальны и возвращать несколько значений

function f() return 1 end

local function f() return 1,2,3 end

-- Функции могут содержать неопределенные параметры

function f(a, b, ...) end

-- SAMPLE 1

printR = ""

function printx(...)
    for i,v in ipairs{...} do
        printR = printR .. tostring(v) .. ", "
    end
    printR = printR .. "n"
end

printx('c','a','d','b')

print("RES="..printR)

-- SAMPLE 2

function fwrite (fmt, ...)
   return io.write(string.format(fmt, unpack(arg)))
end

-- Названия функций могут сразу попадать в таблицы

a={}; a.b={}
function a.b.f(p1,p2) print(p1,p2) end
a.b.f = function (p1,p2) print(p1,p2) end
a.b.f(3,4) -- 3  4

-- Функции могут принимать аргумент self (через :)

a={b={}}
function a.b:f(p1,p2) print(p1,p2) end
a.b.f = function (self, p1, p2) print(p1,p2) end
a.b.f(3, 4) -- 4  nil
a.b:f(3, 4) -- 3  4


-- Дополнительные примеры

function f(a, b) end
function g(a, b, ...) end
function r() return 1,2,3 end

-- вызовы функций

f(3)             -- a=3, b=nil
f(3, 4)          -- a=3, b=4
f(3, 4, 5)       -- a=3, b=4
f(r(), 10)       -- a=1, b=10
f(r())           -- a=1, b=2
g(3)             -- a=3, b=nil, ... -->  (nothing)
g(3, 4)          -- a=3, b=4,   ... -->  (nothing)
g(3, 4, 5, 8)    -- a=3, b=4,   ... -->  5  8
g(5, r())        -- a=5, b=1,   ... -->  2  3

return ...       -- вернуть все полученные аргументы
a = {f(x,y,z)}   -- взять список возвращаемых значений
a = {f(),nil}    -- взять только первый результат
a = (f(x,y,z))   -- взять только первое значение,
                    если функция возвращает список
a,b,c = f(x)