带字符串键的Lua表不能与数字索引一起使用?

时间:2018-09-01 03:33:42

标签: lua lua-table

我是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 个答案:

答案 0 :(得分:2)

向表中添加值也不会像使用索引键一样添加它们。当您使用表中的值时,可以像第一个示例一样使用点符号来访问它们,或者像这样:

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中的值具有自动分配给每个值的整数索引。如果要一个接一个地迭代它们,可以使用ipairs进行迭代:

for i, v in ipairs(t) do
    print(i, v)
end

答案 1 :(得分:1)

您可以使用元表修改数字索引,但这将完全无用,因为在具有非数字,非连续索引的表中,未指定顺序。

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