Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/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 - Fatal编程技术网

Lua表构造函数中的初始化顺序

Lua表构造函数中的初始化顺序,lua,lua-table,Lua,Lua Table,因此,表构造函数有两个组件,类似列表和类似记录。类似列表的条目总是优先于类似记录的条目吗?我的意思是,考虑下面的场景: a = {[1]=1, [2]=2, 3} print(a[1]) -- 3 a = {1, [2]=2, [1]=3} print(a[1]) -- 1 索引1是否总是与第一个列表项相关联,2是否总是与第二个列表项相关联,依此类推?或者还有其他什么吗?在Lua中有两种类型的表,数组和字典,它们是您所称的列表和记录。数组按顺序包含值,这给了您一些优势,比如更快的迭代或插入/删

因此,表构造函数有两个组件,类似列表和类似记录。类似列表的条目总是优先于类似记录的条目吗?我的意思是,考虑下面的场景:

a = {[1]=1, [2]=2, 3}
print(a[1]) -- 3
a = {1, [2]=2, [1]=3}
print(a[1]) -- 1

索引1是否总是与第一个列表项相关联,2是否总是与第二个列表项相关联,依此类推?或者还有其他什么吗?

在Lua中有两种类型的表,数组和字典,它们是您所称的列表和记录。数组按顺序包含值,这给了您一些优势,比如更快的迭代或插入/删除值。字典就像一个巨大的查找表,它没有顺序,它的优点是您可以使用任何值作为键,并且没有限制

当你构造一个表时,你有两个语法,你可以用逗号分隔这些值,例如{2,4,6,8}从而创建一个带有键1到n的数组,或者你可以定义键值对,例如{[1]=2,[58]=4,[368]=6,[48983]=8}创建一个字典,你可以经常混合使用这些语法,你不会遇到任何问题,但在您的场景中并非如此

您所做的是在表的初始构造过程中定义同一个键两次。这通常是不切实际的,因此在语言的发展过程中没有认真考虑过。这意味着所发生的本质上是未指明的行为。目前还不完全了解这将产生什么影响,并且在不同的平台或实现中可能不一致


因此,您不应该在任何商业项目中使用它,也不应该在与其他人共享的任何代码中使用它。如果有疑问,请构造一个空表,然后定义键值对。

未指定a={1,[2]=2,[1]=3}的结果。PUC Lua和LuaJIT的实际结果会有所不同。不要在产品中使用这样的代码。@EgorSkriptunoff那么a={[1]=1,[2]=2,3}的结果应该是这样的吗?[…]在语言开发过程中没有真正考虑到这一点是不正确的。已经考虑过了,但是检查时间和代码复杂性的成本超过了好处,因此没有检查。再小的NIT拾取,行为并不是未定义的,但至少在C和C++标准中使用的语言是不明确的。它不是任何可能发生的情况,只是没有定义相等键的赋值顺序。“没有人知道它被考虑过了吗?”也将在未指定的情况下进行编辑我找不到我要找的代码段,但是十年前在Lua ML上的这个交换表明他们当时知道这一点,并且有一个独立的静态检查程序。将这种逻辑转移到Lua中是一种明显的可能性,因此我假设已经考虑了这个选项,但是Lua对重复密钥的行为在此后发布的几个新版本中没有改变。其中的一部分似乎对新手有误导性。数组正确的Lua项序列不会加速迭代,因为next几乎不会比IPAIR返回的函数慢。虽然可以节省一些空间,但若表包含一个序列,即对于某些正n,在1..n范围内的整数键处的非nil值。并且insert/remove into sequence明显为On,而set into table键为O1。这些根本不具有可比性。此外,根据5.3手册,对于重复键,只有赋值顺序未定义,而行为未定义。@user3125367迭代速度加快,因为您可以使用数字for循环。