簡體   English   中英

帶字符串鍵的Lua表不適用於數字索引?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM