Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么不是';我的LUA解释器不能处理字符串键值吗?_Lua_Lua Table_Lua 5.3 - Fatal编程技术网

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

为什么不是';我的LUA解释器不能处理字符串键值吗?,lua,lua-table,lua-5.3,Lua,Lua Table,Lua 5.3,使用预定义脚本和LUA运行时环境测试代码时,LUA不会采用任何形式的字符串键值。但是,如果使用数值键,LUA将按预期使用它。当我将Tshark与LUA文件一起使用以解析数据包捕获时,此规则的例外情况。这允许字符串键值语法正常工作。有什么我可能做错了吗 我尝试创建了几个不同变体的.lua脚本文件,包括: testArray.NewItem=“value1” testArray[“NewItem”]=“value1” NewItemValue=“NewItem” testArray[NewItemV

使用预定义脚本和LUA运行时环境测试代码时,LUA不会采用任何形式的字符串键值。但是,如果使用数值键,LUA将按预期使用它。当我将Tshark与LUA文件一起使用以解析数据包捕获时,此规则的例外情况。这允许字符串键值语法正常工作。有什么我可能做错了吗

我尝试创建了几个不同变体的.lua脚本文件,包括:

testArray.NewItem=“value1” testArray[“NewItem”]=“value1”

NewItemValue=“NewItem” testArray[NewItemValue]=“值1”

这些都会导致一个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”之后的打印输出(#tcpstream)应显示1而不是零。随后的打印(tcpstream[1])也应显示“nothing”(无)

#运算符不计算表中的所有项目(!)。而是查找最后一个整数(非小数)键。由于它的实现方式,如果表中的所有整数键不是连续的,则其结果是未定义的。这就是为什么它不应该用于用作稀疏数组的表[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为零,n可以为零对于非nil值从1到给定n的正则数组,其长度正好是其最后一个值的索引n。如果数组有“洞”(即,其他非nil值之间的nil值),则#t可以是直接位于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

在撰写本文时,您对Lua版本的参考是正确的。当前版本的参考手册给出了不同的描述。显然,应该使用begin used版本的参考手册。如果在其设计的表上使用了
#
,则该参考手册是正确的。“从数字1开始的连续键数”:这与您引用的5.1引用相矛盾。@TomBlodget我已在支持我的声明的手册中用粗体表示。如果这一行不能消除矛盾,我可能需要更多信息来理解您所指的矛盾。
{“一”、“二”、“三”“,无,“五”,无,“七”}
根据您的描述,这将是3。根据5.1,它可以是任何整数>=0。根据5.3,它可以是3、5或7。简言之,#被误用到这样的表中。@TomBlodget 5.3是不确定的,我现在已经澄清了这一点。我仍在努力解决5.1注释。您的测试无效,因此您的结论无效。
print(tcpstream[stream1])
打印“无”。