[英]Lua table with string keys does not work with number indexing?
我是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
number迭代遍歷表而不必知道密鑰字符串?
如果是這樣,是否有任何工作可以使雙向工作?
向表中添加值也不會像索引鍵一樣添加它們。 當您使用表中的值時,可以使用點表示法訪問它們,如第一個示例中所示,或者像這樣:
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
您可以使用metatable來破解自己的數字索引,但這將完全無用,因為在具有非數字,非連續索引的表中,未指定順序。
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.