2017-02-15 88 views
1

因此,表构造函数有两个组件,类似于列表和类似记录。列表类项目总是优先于类似记录的项目吗?我的意思是,请考虑以下情形:Lua表构造函数的初始化顺序

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

是该指数1总是与第一列表类似的条目,2与第二相关,等等?或者还有别的吗?

+2

未指定'a = {1,[2] = 2,[1] = 3}'的结果。 PUC Lua和LuaJIT的实际结果会有所不同。不要在生产中使用这些代码。 –

+0

@EgorSkriptunoff那么应该是'a = {[1] = 1,[2] = 2,3}'的结果吗? – ibrahim5253

+0

[UB](https://en.wikipedia.org/wiki/Unspecified_behavior) –

回答

0

有两种类型在Lua表,阵列字典,这些都是你所说的“名单”和“记录”。一个数组,包含值的顺序,这给你一些优点,如更快的迭代或插入/删除值。 字典像一个巨大的查找表一样工作,它没有顺序,它的优点是你可以如何使用任何值作为一个关键,并且你不受限制。

当你构造一个表时,你有2个语法,你可以用逗号分隔这些值, {2,4,6,8}从而创建具有键1到n的数组,或者可以定义键值对,例如, {[1]=2,[58]=4,[368]=6,[48983]=8}创建一个字典,你可以经常混合这些语法,你不会遇到任何问题,这不是你的情况。

你在做什么是在表的初始构造期间两次定义相同的密钥。这通常是不切实际的,因此在语言的发展过程中并没有真正的认真思考。这意味着发生的事情本质上是未指定的行为。目前还不能完全理解这将会产生什么影响,并且可能在不同的平台或实现中不一致。

因此,您不应该在任何商业项目或任何您将与其他人分享的代码中使用此功能。如果有疑问,请构建一个空表并在之后定义键值对。

+1

_“[...]在语言开发过程中没有真正考虑过”_是不正确的。它已经被考虑过了,但是检查这个代码(时间和代码复杂度)的成本大于好处,所以没有检查。进一步的(轻微的挑剔),行为不是_undefined_,而是_unspecified_(至少在C和C++标准中使用的语言) - 事情不会发生,仅仅是分配顺序相等键未定义。 – nobody

+0

@nobody来源,它被认为是?也将编辑在*未指定* – warspyking

+0

找不到我正在寻找的片段,但这次交流[1](http://lua-users.org/lists/lua-l/2007-03/msg00277.html), [2](http://lua-users.org/lists/lua-l/2007-03/msg00280.html)关于十年前的Lua-ML〜表明,他们意识到那时候并且有工作独立静态检查器。将这个逻辑移入Lua是一个明显的可能性(所以我认为这个选项已经被考虑过),但是Lua对于重复键的行为在自那以后发布的几个新版本中并没有改变。 – nobody