我是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
遍历表而不必知道键字符串?
如果是这样,有什么办法可以使双向运行正常?
答案 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