[英]Why isn't my LUA interpreter able to handle string key values?
使用預定義腳本和LUA運行時環境測試代碼時,LUA不會采用任何形式的字符串鍵值。 但是,如果使用數字鍵,LUA將按預期使用它。 當我將Tshark與LUA文件一起使用以解析數據包捕獲時,此規則的例外。 這使字符串鍵值語法可以正常工作。 我可能在執行某些錯誤的操作嗎?
我嘗試創建多個具有不同變體的.lua腳本文件,包括:
testArray.NewItem =“ value1” testArray [“ NewItem”] =“ value1”
NewItemValue =“ NewItem” testArray [NewItemValue] =“ value1”
由於嘗試檢查nil值(取決於用於檢查的返回樣式),所有這些都會導致nil值或錯誤。
> tcpstream = {}
> stream1 = tostring(14356)
> tcpstream[stream1] = "nothing"
> print(#tcpstream)
0
> print(tcpstream[1])
nil
> tcpstream[1] = "nothing"
> print(#tcpstream)
1
> print(tcpstream[1])
nothing
tcpstream [stream1] =“ nothing”之后,print(#tcpstream)的輸出應顯示1而不是零。 隨后的print(tcpstream [1])也應顯示“ nothing”。
從http://lua-users.org/wiki/TablesTutorial
#運算符不會計算表中的所有項目(!)。 而是找到最后一個整數(非小數)鍵。 由於其實現方式,如果表中的所有整數鍵都不連續,則其結果是不確定的。 這就是為什么它不應該用於稀疏數組[2]的表。
“#”不是一種計數Lua表中元素數量的好方法(有時不正確)。
至於
> stream1 = tostring(14356)
> tcpstream[stream1] = "nothing"
> print(#tcpstream)
0
> print(tcpstream[1])
nil
Lua使用鍵,值對,而不是顯式索引。 如果執行“ arr [1] = 22”,則表示鍵“ 1”的值為22,而不是第一個元素的值為22。
長度運算符( #
)不起作用,這對於Lua初學者來說是一個常見錯誤。
#sometable
的默認行為是返回從數字1
(或在5.3的任何nil值之后)開始的連續鍵的數目。 永遠不會使用表的默認#
運算符評估字符串鍵。
在5.3中,如果您的序列包含多個nil值,則#
的行為是不確定的。
我將包括5.1中的行,因為我認為它很好地涵蓋了有關操作員和表格的信息。 盡管注意與5.3的工作方式相同,但可能更容易理解為什么您看到自己的行為。
2.5.5 –長度運算符長度運算符由一元運算符#表示。 字符串的長度是其字節數(即,每個字符為一個字節時字符串長度的通常含義)。
表t的長度定義為任何整數索引n,以使t [n]不為nil,t [n + 1]為nil; 此外,如果t 1為零,則n可以為零。 對於具有從1到給定n的非零值的常規數組,其長度恰好是n(其最后一個值的索引)。 如果數組具有“空洞”(即,其他非nil值之間的nil值),則#t可以是直接在nil值之前的任何索引(也就是說,它可以將任何此類nil值視為末尾)數組)。
以下是不同表格及其#
結果的一些示例:
table1 = { --number keys in array
true,
true,
true,
}
table2 = { -- number keys in hash
[1] = true,
[2] = true,
[3] = true,
}
table3 = { -- only strings as key
['1'] = true,
['2'] = true,
['3'] = true,
}
table4 = { -- No key 2 defined
[1] = true,
-- [2] = true,
[3] = true,
}
table5 = { -- table with both string and number keys
[1] = true,
['2'] = true,
}
print(#table1) -- 3
print(#table2) -- 3
print(#table3) -- 0
print(#table4) -- v5.3(1 or 3) v5.1(1)
print(#table5) -- 1
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.