Lua中获取table长度的方法

 更新时间:2015年04月23日 08:44:32   投稿:junjie  
这篇文章主要介绍了Lua中获取table长度的方法,本文用多个实例讲解多种情况下获取Table长度的方法,需要的朋友可以参考下

官方文档是这么描述#的:

取长度操作符写作一元操作 #。 字符串的长度是它的字节数(就是以一个字符一个字节计算的字符串长度)。

table t 的长度被定义成一个整数下标 n 。 它满足 t[n] 不是 nil 而 t[n+1] 为 nil; 此外,如果 t[1] 为 nil ,n 就可能是零。 对于常规的数组,里面从 1 到 n 放着一些非空的值的时候, 它的长度就精确的为 n,即最后一个值的下标。 如果数组有一个“空洞” (就是说,nil 值被夹在非空值之间), 那么 #t 可能是指向任何一个是 nil 值的前一个位置的下标 (就是说,任何一个nil 值都有可能被当成数组的结束)。

复制代码 代码如下:

local tblTest2 =
{
    1,
    a = 2,
    3,
}

print(table.getn(tblTest2))


这段代码输出的结果是多少?这里的输出结果应该是2。首先,要明白,这个tblTest2不是一个简单的table,它混合了列表(list)和记录(record)两种风格,表中,a = 2是record风格。其次,要明白,record风格的record是不作为外表的长度计算。你可以把它想象成一个函数,跟其他面向对象语言一样,函数是不记为内部变量的。

既然像函数一样,那就可以输出a的值,是的。print(tblTest2.a)就可以了。

再看下面的代码:

复制代码 代码如下:

local tblTest3 =
{
    1,
    {a = 2},
    3,
}

print(table.getn(tblTest3))


这段代码输出的结果是多少?这里的输出结果应该是3。要注意,表嵌套表,嵌套表也是元素。所以,输出的结果是3。
复制代码 代码如下:

table.getn(t)

等价于 #t。
以下情况相当纠结,可直接看最后一句话总结:

现在来看一个比较纠结的:

复制代码 代码如下:

local tblTest4 =
{
    1,
    nil,
}

print(table.getn(tblTest4))


这段代码输出的结果是多少?是1。我们都知道table获取长度的时候,会遍历一下整个表,在最后一个非nil处,就会返回。
但是,下面这段代码呢?
复制代码 代码如下:

local tblTest5 =
{
    1,
    nil,
    2,
}

print(table.getn(tblTest5))


输出3,好玩吧?它把nil也当成元素计算长度了。但叫你摸不着头脑的是下面这段代码:。
复制代码 代码如下:

local tblTest5 =
{
1,
nil,
2,
nil
}

输出1.再发一段,让你完全蒙掉:
复制代码 代码如下:

local tblTest5 =
{
1,
nil,
2,
nil,
3,
nil
}

输出3.蒙了没?再看,这一段叫你以后再也不敢再table中写nil值:
复制代码 代码如下:

local tblTest5 =
{
1,
nil,
2,
nil,
3,
nil,
4,
nil
}

看看吧,这一段的输出结果是1。亲,请问,你以后还敢在lua的table中用nil值吗???如果你继续往后面加nil,你可能会发现点什么。你可能认为你发现的是个规律。但是,你千万不要认为这是个规律。因为这是错误的。

1、在table中不要使用nil

2、如果非要使用nil,必须用table.setn()函数去设置这个table表的长度。注意:新版本的lua已经不支持setn了。

必须给你个结论:

setn函数已过时,不要在lua的table中使用nil值,如果一个元素要删除,直接remove,不要用nil去代替。

相关文章

  • 简单的Lua 连接操作mysql数据库的方法

    简单的Lua 连接操作mysql数据库的方法

    lua连接数据库不只luasql这个库,但目前更新最快的的貌似是这个luasql,他是开源的,下面我们就来看看如何来具体操作吧
    2015-10-10
  • lua中赋值类型代码详解

    lua中赋值类型代码详解

    本文主要给大家介绍了lua中解析复制类型代码的过程,非常的细致全面,有需要的小伙伴可以参考下
    2015-05-05
  • Lua学习笔记之表达式

    Lua学习笔记之表达式

    在Lua中,表达式包括:数值常量、字符串字面值、变量、单目和双目运算符,函数调用,也包括一些非传统的函数定义和表结构。今天我们就来详细了解下lua中的表达式
    2015-04-04
  • Lua table类型学习笔记

    Lua table类型学习笔记

    这篇文章主要介绍了Lua table类型学习笔记,本文讲解了table的基础知识和table库函数的使用以及面向对象编程实例,需要的朋友可以参考下
    2015-04-04
  • Lua和C++的通信流程代码实例

    Lua和C++的通信流程代码实例

    这篇文章主要介绍了Lua和C++的通信流程代码实例,本文是上一篇的DEMO,本文用代码讲解Lua和C++之间的通信,需要的朋友可以参考下
    2014-09-09
  • Lua判断变量是否为数字、字符串是否可以转换为数字等

    Lua判断变量是否为数字、字符串是否可以转换为数字等

    这篇文章主要介绍了Lua判断变量是否为数字、字符串是否可以转换为数字等,本文讲解了Lua 判断是字符还是数字的方法、Lua判断数字的方法、判断可否转换为数字的方法、判断并且准备一个初值的方法,需要的朋友可以参考下
    2015-04-04
  • 深入谈谈lua中神奇的table

    深入谈谈lua中神奇的table

    table 在lua中是一个非常常用的数据结构,可以用来存放各种类型的元素,下面这篇文章就来给大家介绍了关于lua中神奇的table的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面来一起看看吧
    2018-07-07
  • Lua教程(十一):模块与包详解

    Lua教程(十一):模块与包详解

    这篇文章主要介绍了Lua教程(十一):模块与包详解,本文讲解了require函数、 编写模块的基本方法、使用环境、module函数等内容,需要的朋友可以参考下
    2015-04-04
  • Lua中的metatable详解

    Lua中的metatable详解

    这篇文章主要介绍了Lua中的metatable详解,本文详细讲解了metatable的作用、定义操作符行为、为 Lua 函数库提供支持等内容,需要的朋友可以参考下
    2014-10-10
  • Lua教程(四):在Lua中调用C语言、C++的函数

    Lua教程(四):在Lua中调用C语言、C++的函数

    这篇文章主要介绍了Lua教程(四):在Lua中调用C语言、C++的函数,本文给出了多个示例讲解如何在Lua中调用C/C++写的函数,需要的朋友可以参考下
    2014-09-09

最新评论