2015-09-10 5 views
2

Взгляни на этом примере коде:Lua таблицы доступа с переменным количеством ключей

tbl = { 
    status = { 
     count = 0 
    } 
} 

function increase(t, ...) 
    -- ??? 
end 

increase(tbl, "status", "count") -- increases tbl["status"]["count"] by 1 

Я хочу, чтобы иметь возможность динамически получать доступ к записи в таблице с помощью переменного количества строк ключей, есть ли способ сделай это?

+1

Да. Просто продолжайте индексирование до тех пор, пока у вас есть аргументы и не удалите не-таблицу. Вы пробовали написать функцию? –

+0

Да, я пробовал написать его, но в конце концов, только с ссылкой на значение записи, которую я, очевидно, не могу назначить, не могли бы вы показать мне свое решение? – user1826176

+1

Покажите свою попытку и объясните, как она не работает. –

ответ

1
tbl = { 
    status = { 
     count = 0 
    } 
} 

function increase(t, ...) 

    local target = t 
    local args = {...} 
    local last = "" 

    for i, key in pairs(args) do 
     if i == #args then 
      last = key 
     else 
      target = target[key] 
     end 
    end 

    target[last] = target [last] + 1 
end 

increase(tbl, "status", "count") -- increases tbl["status"]["count"] by 1 
+0

Необходимо использовать 'ipairs' хотя и, возможно, вычислить' # args' только один раз – ryanpattison

4

Вот что рекурсия для:

function increase(t, k1, k2, ...) 
    if k2 == nil then 
     t[k1] = (t[k1] or 0) + 1 
    else 
     if t[k1] == nil then 
      t[k1] = { } -- remove this to disable auto-creation 
     end 
     increase(t[k1], k2, ...) 
    end 
end 

local t = { } 
increase(t, "chapter A", "page 10") 
increase(t, "chapter A", "page 13") 
increase(t, "chapter A", "page 13") 
increase(t, "chapter B", "page 42", "line 3"); 

function tprint(t, pre) 
    pre = pre or "" 
    for k,v in pairs(t) do 
     if type(v) == "table" then 
      print(pre..tostring(k)) 
      tprint(v, pre.." ") 
     else 
      print(pre..tostring(k)..": "..tostring(v)) 
     end 
    end 
end 

tprint(t) 

выход:

chapter A 
    page 10: 1 
    page 13: 2 
chapter B 
    page 42 
    line 3: 1 
Смежные вопросы