Lua 的 table 长度运算符是如何工作的?

有人能解释这个看似不可思议的操作吗?

> t = {1, 2, 3} -- 表的长度为 3,很简单
> = #t
3  -- 是的

> t[3] = nil -- 移除最后一个元素?
> = #t
2 -- 好的它意识到了这是最后一个元素(因为 #t = 3),并且减少了这个长度

> t[6] = 6 -- 添加一个单独的元素?
> = #t
2 -- 好的... 我猜?尽管它肯定知道 #t = 2,所以现在 #t 应该是 6?

> t[4] = 4 -- 再添加一个单独的元素
> = #t
4 -- 嗯... 什么鬼。

> t[5] = 5 -- 追加另一个元素
> = #t
6 -- 好的现在它记得元素 6 了?什么鬼?

好吧让我再试一次...

> t = {1, 2, 3}
> = #t
3
> t[10] = 10
> = #t
3
> t[4] = 4
> = #t
4
> t[9] = 9
> = #t
4
> t[8] = 8
> = #t
10

什么鬼?

点赞
用户415823
用户415823

仅当表是正确序列(连续的整数键)时,才定义表的长度。

Lua manual 解释了长度运算符:

如果没有提供 __len 元方法,则表 t 的长度仅在表是序列的情况下定义,即其正数数字键的集合等于 {1..n},其中 n 为非负整数。在这种情况下,n 就是它的长度。请注意,像下面这样的表

{10, 20, nil, 40}

不是一个序列,因为它有键 4 但没有键 3。 (因此,对于该表,不存在一个集合 {1..n} 等于其正数数字键的集合。) 但是请注意,非数字键不会影响一个表是否是序列。

2016-04-25 18:08:18