我在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
,而不必知道密钥字符串与数字索引?
如果是这样,有没有解决办法,使这两个工作方式?
添加值表不还其添加为索引键以及。 当你走在你的表使用的值,你可以访问他们要么使用点符号,在你的第一个例子,或者是这样的:
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
你能砍自己使用元表数字指标,但是这将是完全无用的,因为与非数字,非连续的索引的顺序表是不确定的。
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