Lua Table 长度的计算

LogicRhapsody
• 阅读 12073

计算 Lua 的 Table长度

在 Lua 中,我们可以通过这个符号”#“ 来计算字符串的长度和一个table的长度,比如:

str = "I'am a string!"
print(#str) => 14

通常这个#符号也可以用来计算一个 Table 的长度,比如:

t = {1, 2, 3, 5, 100}
print(#t) => 5

t = {1, 2, 3, 5, {}, 100}
print(#t) => 6

上面两个例子都很好理解,再来看一个:

t = {1, 2, a=3, 5, {}, 100}
print(#t) => 5

这里 a=3 不能算是sequence序列的一个成员,所以a=3并没有被统计进去,再来看看这个列子:

t = {1, 2, a=3, nil, 100}
print(#t)

这个大家可以试试,我的lua版本是5.2 输出结果是 4

t = {1, 2, a=3, nil}
print(#t) => 2

可以看到,当sequence中有nil的时候,这个结果就有点不好理解了,如果nil也被统计进长度,那么上面的例子输出应该是3而不是2,如果不统计那么倒数第二个例子应该是输出3而不是4,这是为什么呢?

先来看看 Lua 5.1 对 这个#操作的定义,这个定义可以写的不是很好理解,但是也能看出来#对lua table的单目操作是定义在这个table里所有成员都是非nil的前提下,Lua 5.2的定义更容易让人明白,引用:

A program can modify the behavior of the length operator for any value
but strings through the __len metamethod (see §2.4).

Unless a __len metamethod is given, the length of a table t is only
defined if the table is a sequence, that is, the set of its positive
numeric keys is equal to {1..n} for some non-negative integer n. In
that case, n is its length. Note that a table like

 {10, 20, nil, 40} is not a sequence, because it has the key 4 but does not have the key 3. (So, there is no n such that the set {1..n}

is equal to the set of positive numeric keys of that table.) Note,
however, that non-numeric keys do not interfere with whether a table
is a sequence.

可以看到,类似{10, 20, nil, 40}这样的table并不能定义为一个sequence,自然#符号对这个table的操作就是无效的,未有定义的,如果一定要计算这样的table或者处理table中有a=2 这样的非sequence元素的时候,则需要自己修改metatable来定义__len这个函数实现自定义的处理方法,这个下次再说。

因为这个原因业务上吃了大亏,记录下修改代码去了

点赞
收藏
评论区
推荐文章
lix_uan lix_uan
4年前
Java学习总结
JavaHashMap和HashTablejdk1.8中采用数组链表红黑树实现首先会创建一个默认长度为16,默认加载因为0.75的table数组根据hash值和数组的长度计算应存入的位置判断当前位置是否为空,如果为空则直接存入如果当前位置不为空,则调用equals方法比较属性值如果一样则替换为新的,如果不一样则采用头插法插入当节点数多于8
Stella981 Stella981
4年前
C++下LuaPB协议升级
使用LuaTable解码编码PB协议,效率比较低,主要是因为需要lua内部字符串比较和跨lua和c之间的Int解码操作,比较消耗如果从C部分,直接访问lua虚拟机内部的Table数据结构,以及使用lua字符串自带的hash值,来做比较,效率会有比较大提升例如原始需要5000ms处理编码一个Luatable为PB,在纯C
Wesley13 Wesley13
4年前
lua中的table
1、table是lua中最重要的数据类型。2、table类似于python中的字典。3、table只能通过构造式来创建例1:Lua代码 mytable{a10,b11,c20,ddd30} print(mytable\"a"\) 
Stella981 Stella981
4年前
Lua Table 引用, 拷贝
   lua除了简单类型分配内存外,table只是传递引用,所以不能用简单的""来copy两个表,并试图修改一个表中的值。tb  {}tb.a  11tb.b  22tb_ref  tbfunction p(tip)  print("
Stella981 Stella981
4年前
JSON 转lua table php版
functiondata2lua($data){$datajson_encode($data,JSON_UNESCAPED_UNICODE);$listsmbStrSplit($data);$lengthcount(
Stella981 Stella981
4年前
Lua中table的实现
本文来自《Lua设计与实现》的阅读笔记,推荐Lua学习者可以购买一本,深入浅出讲解lua的设计和实现原理,很赞,哈哈Lua中对于表的设计,是基于数组和散列表,和其他语言不同,对于数组的下标是从1开始的,对于散列表而言,只要其键值补位nil,都可以存储在其中。一、table的基本类型定义首先看看table的数据定义,参考源码lobject.
Wesley13 Wesley13
4年前
MySQL索引的索引长度问题
MySQL的每个单表中所创建的索引长度是有限制的,且对不同存储引擎下的表有不同的限制。在MyISAM表中,创建组合索引时,创建的索引长度不能超过1000,注意这里索引的长度的计算是根据表字段设定的长度来标量的,例如:createtabletest(idint,name1varchar(300),name2varchar(300),nam
Stella981 Stella981
4年前
Lua学习笔记_String(一)
   Lua中的字符串可以包含一个字母也可以是一整本书。用一个字符串表示100K甚至1M的内容在Lua中并不罕见。     在Lua中,字符串是字节的序列。Lua内核中不关心这些字节是什么编码格式。Lua只是单纯地以8bit为单位保存它们,且每个字节可以是任意数字,包括0。这就意味着我们可以用字符串保存任意二进制数据。也可以将Unicode字符串保存为任
Stella981 Stella981
4年前
Lua程序设计之字符串精要
(摘自Lua程序设计)基本:Lua语言的字符串是一串字节组成的序列。在Lua语言中,字符使用8个比特位来存储。Lua语言中的字符串可以存储包括空字符在内的所有数值代码,这意味着我们可以在字符串中存储任意的二进制数据。Lua语言中的字符串是不可变值,我们不能像C语言中那样直接改变某个字符串中的某个字符,但是我们可以通过创建一个新字符
Wesley13 Wesley13
4年前
Java中的字符串的最大长度
Java中的字符串的最大长度看String的源码可以看出来,String实际存储数据的是charvalue\\,数组的长度是int类型,整数在java中是有限制的,我们通过源码来看看int类型对应的包装类Integer可以看到,其长度最大限制为2^311,那么说明了数组的长度是0~2^311,那么计算一下就是(2^31121474
Stella981 Stella981
4年前
JavaScript常用函数
1\.字符串长度截取functioncutstr(str,len){vartemp,icount0,patrn/^\x00\xff/,strre"";for(vari
LogicRhapsody
LogicRhapsody
Lv1
四月清和雨乍晴,南山当户转分明。更无柳絮因风起,惟有葵花向日倾。
文章
5
粉丝
0
获赞
0