Lua-返回的表格大小不同

时间:2019-01-23 22:30:37

标签: lua lua-table

伙计们。有人可以帮我吗?

输入

a = {}

a.c = {1,2,3}

print(#a)

print(a.c)

输出

0

table: 0x11ed7a0

为什么#a为0?为什么不是1?

谢谢。

2 个答案:

答案 0 :(得分:3)

它为零,因为您的表a不是序列。

序列是一个使用1..n键的表,其中n是序列的大小。

换句话说,#用于序列长度,而不是表长度。

Lua 5.3 Reference Manual

  

只有一个边界的表称为序列。例如,表格       {10,20,30,40,50}是一个序列,因为它只有一个边界(5)。桌子       {10,20,30,nil,50}有两个边界(3和5),因此不是       顺序。表格{nil,20,30,nil,nil,60,nil}具有三个边框(0、3,       和6),所以它也不是序列。表{}是边界为0的序列。       请注意,非自然键不会干扰表是否为序列。

     

当t是一个序列时,#t返回其唯一的边界,该边界与       序列长度的直观概念。当t不是序列时,#t       可以返回其任何边界。 (确切的内容取决于       表的内部表示,而表的内部表示又取决于表的方式       并填充了其非数字键的内存地址。)

答案 1 :(得分:1)

Lua表的构造与其他语言的构造不同。正如Lua manual所示:

  

表是Lua中主要的(实际上是唯一的)数据结构化机制,也是功能强大的一种。我们使用表以简单,统一和有效的方式表示普通数组,符号表,集合,记录,队列和其他数据结构。

此外,表具有足够的动态性,可以一次以多种方式使用它。例如,一个表可以同时用作数组和映射。这在内部产生了一些不幸的后果。在内部,每个Lua表都有两个部分:数组和哈希映射。

length运算符仅对表的数组部分进行操作;不使用额外的内存来存储表中包括哈希映射部分的项目总数。如果需要该功能,则必须手动实现。这样做的几种好方法是使用getter和setter,手动更新本地计数器或使用具有索引和newindex元方法的代理表。

作为一个有趣的补充说明,有时可能很难判断某个值是否存储在表的数组或哈希部分中。考虑一下Lua 5.3中的这些示例:

1: t = {true, nil, true}  -- #t = 3
2: t = {true, [2] = true} -- #t = 2
3: t = {true, [3] = true} -- #t = 1
4: t = {true, true, true} t[2] = nil -- #t = 3