Lua: Operacje na tablicach

Kolejna ściągawka składniowa.

Zadeklarowanie tablicy:

    NazwaZmiennej = {}

Zadeklarowanie tablicy z początkowymi danymi:

    NazwaZmiennej = {"tekst 1", 3, InnaTablica= {"pole w innej tablicy","drugie pole w innej tablicy"},"kolejny napis w glownej tablicy"}

Push:

    a = {}

    table.insert(a,"jakiś tekst")

 

Pop:

    table.remove(a,1)

Ile elementów ma tablica?

    print(table.getn{10,2,4})          -- 3
    print(table.getn{10,2,nil})        -- 2
    print(table.getn{10,2,nil; n=3})   -- 3
    print(table.getn{n=1000})          -- 1000

    a = {}
    print(table.getn(a))               -- 0
    table.setn(a, 10000)
    print(table.getn(a))               -- 10000

    a = {n=10}
    print(table.getn(a))               -- 10
    table.setn(a, 10000)
    print(table.getn(a))               -- 10000

inną opcją jest użycie operatora #. Ma on jednak jedną wadę! Nie liczy, tylko wyświetla wartość najwyższego indeksu:

    t = {"a", "b", "c"}
    = #t
    3

Pętla po parach w tablicy:

    t = {"a", "b", [123]="foo", "c", name="bar", "d", "e"}
    for k,v in pairs(t) do print(k,v) end
    1       a
    2       b
    3       c
    4       d
    5       e
    123     foo
    name    bar

można też wykorzystać ipairs. Gwarantuje to, że zawsze otrzymamy rekordy w poprawnej kolejności. To rozwiązanie wyświetla jednak tabelę tylko po indeksach, nie po kluczach.

    t = {"a", "b", "c"}
    for i, v in ipairs(t) do print(i, v) end
    1       a
    2       b
    3       c

Funkcja do wyświetlania zawartości tablic w postaci zrozumiałej dla ludzi (implementacja print_r z php):

function print_r ( t ) 
        local print_r_cache={}
        local function sub_print_r(t,indent)
                if (print_r_cache[tostring(t)]) then
                        print(indent.."*"..tostring(t))
                else
                        print_r_cache[tostring(t)]=true
                        if (type(t)=="table") then
                                for pos,val in pairs(t) do
                                        if (type(val)=="table") then
                                                print(indent.."["..pos.."] = "..tostring(t).." {")
                                                sub_print_r(val,indent..string.rep(" ",string.len(pos)+8))
                                                print(indent..string.rep(" ",string.len(pos)+6).."}")
                                        elseif (type(val)=="string") then
                                                print(indent.."["..pos..'] = "'..val..'"')
                                        else
                                                print(indent.."["..pos.."] = "..tostring(val))
                                        end
                                end
                        else
                                print(indent..tostring(t))
                        end
                end
        end
        if (type(t)=="table") then
                print(tostring(t).." {")
                sub_print_r(t,"  ")
                print("}")
        else
                sub_print_r(t,"  ")
        end
        print()
end

inne podejście do problemu:

function inspect(obj)
        if obj==nil then return "nil" end
        if obj==true then return "true" end
        if obj==false then return "false" end
        if type(obj)=="string" then return obj end
        local json = require "json"
        return json.encode({obj})
end

function debug(obj)
        print(inspect(obj))
end

Oba rozwiązania znalezione na: http://developer.coronalabs.com/code/printr-implementation-dumps-everything-human-readable-text

Dzięki za komentarz!