为什么我的LUA解释器不能处理字符串键值?

时间:2019-07-26 18:46:22

标签: lua lua-table lua-5.3

在使用预定义脚本和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”。

2 个答案:

答案 0 :(得分:3)

来自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。

答案 1 :(得分:0)

长度运算符(#)不能像您所相信的那样工作,这是Lua初学者的常见错误。

#sometable的默认行为是返回从数字1开始(或在5.3的任何nil值之后)的连续键数。永远不会使用表的默认#运算符来评估字符串键。

在5.3中,如果您的序列包含多个nil值,则#的行为是不确定的。

Lua 5.3 Reference Manual: 3.4.7 – The Length Operator

Lua 5.1 Reference Manual: 2.5.5 – The Length Operator

我将包括5.1的行,因为我认为它很好地涵盖了有关操作员和表格的信息。尽管注意到与5.3的工作方式相同,但也许更容易理解为什么看到自己的行为。

  

2.5.5 –长度运算符   长度运算符由一元运算符#表示。字符串的长度是其字节数(即每个字符为一个字节时字符串长度的通常含义)。

     

表t的长度定义为任何整数索引n,以使t [n]不为nil,t [n + 1]为nil;此外,如果t 1为零,则n可以为零。 对于具有从1到给定n的非零值的常规数组,其长度恰好是n(其最后一个值的索引)。如果该数组具有“空洞”(即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