Lua表格中使用字符串键无法使用数字索引?

我是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 遍历表而不必知道键字符串?

如果是,是否有任何解决方法使它们都能正常工作?

点赞
用户63791
用户63791

向表中添加值并不会将它们也添加为索引键。当您在表中使用这些值时,可以使用点表示法,如第一个示例中。或者像这样:

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
2018-09-01 04:34:04
用户1944004
用户1944004

你可以使用元表来自己“黑”一个数字索引,但是这将完全无用,因为在一个拥有非数字、非连续索引的表中,顺序是不确定的。

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
2018-09-01 04:36:45