簡體   English   中英

為什么我的LUA解釋器不能處理字符串鍵值?

[英]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值,則#的行為是不確定的。

Lua 5.3參考手冊:3.4.7 –長度運算符

Lua 5.1參考手冊:2.5.5 –長度運算符

我將包括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.

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