Lua的表具有字符串键不与数字索引工作?(Lua table with string keys do

2019-09-30 21:29发布

我在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 ,而不必知道密钥字符串与数字索引?

如果是这样,有没有解决办法,使这两个工作方式?

Answer 1:

添加值表不还其添加为索引键以及。 当你走在你的表使用的值,你可以访问他们要么使用点符号,在你的第一个例子,或者是这样的:

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


Answer 2:

你能砍自己使用元表数字指标,但是这将是完全无用的,因为与非数字,非连续的索引的顺序表是不确定的。

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


文章来源: Lua table with string keys does not work with number indexing?
标签: lua lua-table