代码之家  ›  专栏  ›  技术社区  ›  Zack Lee

带字符串键的Lua表不适用于数字索引?

  •  1
  • Zack Lee  · 技术社区  · 6 年前

    我是Lua的初学者。

    我认为使用字符串键将值推送到表中也会自动执行数字索引,但我认为我错了。

    local t = {}
    t.name = "John"
    t.age = 30
    print("Name : " .. t.name .. "\nAge : " .. t.age)
    

    虽然这段代码运行良好并打印出预期的结果,

    Name : John
    Age : 30
    

    print("Name : " .. t[1] .. "\nAge : " .. t[2])
    

    我得到以下错误:

    lua: main.lua:5: attempt to concatenate a nil value (field '?')
    stack traceback:
        main.lua:5: in main chunk
        [C]: in ?
    

    这是否意味着我不能使用 for

    如果是这样的话,有什么办法可以让这两种方法都起作用吗?

    2 回复  |  直到 6 年前
        1
  •  2
  •   Alex SeedmanJ    6 年前

    向表中添加值并不能像添加索引键那样添加值。当您使用表中的值时,您可以使用点符号(如第一个示例中所示)或如下方式访问它们:

    print("Name : " .. t["name"] .. "\nAge : " .. t["age"])
    

    可以使用函数遍历表中的键值对 pairs 像这样:

    for k, v in pairs(t) do
        print(k, v)
    end
    

    local t = {
        "John",
        30,
    }
    print("Name : " .. t[1].. "\nAge : " .. t[2])
    

    这样做时,表中的值 t 为每个值自动分配整数索引。如果要逐个迭代,可以使用ipair进行迭代:

    for i, v in ipairs(t) do
        print(i, v)
    end
    
        2
  •  1
  •   Henri Menke    6 年前

    local mt = { __index = function(t, n)
                     assert(n > 0)
                     for k, v in pairs(t) do
                         n = n - 1
                         if n == 0 then
                             return v
                         end
                     end
               end }
    
    local t = {}
    setmetatable(t, mt)
    t.name = "John"
    t.age = 30
    print("Name : " .. t.name .. "\nAge : " .. t.age)
    print("Name : " .. t[1] .. "\nAge : " .. t[2])
    

    $ lua test.lua 
    Name : John
    Age : 30
    Name : John
    Age : 30
    $ lua test.lua 
    Name : John
    Age : 30
    Name : 30
    Age : John