zoukankan      html  css  js  c++  java
  • 【lua】table是否为空的判断

    在项目的脚本lua中经常有这样的需求,

    1、local a = {}

    2、对a进行处理

    3、对a是否为空表进行判断

    关于对a是否为空表的判断,如果直接这样做:

    if a == {} then

    这样的结果就是a == {}永远返回false,是一个逻辑错误。因为这里比较的是table a和一个匿名table的内存地址。

    也有些代码如此做:

    if table.maxn(a) == 0 then

    这样做也不保险,除非table的key都是数字,而没有hash部分。

    难道真的要遍历table发现有东西就return false跳出才能断定它是否为空吗?这样做是可以的,至少目前项目中前人是这么封装的,不过代码太难看. 

    网上小搜了一下,发现原来官方手册里早已经给了答案,那就是靠lua内置的next函数

    即如此用:if next(a) == nil then

    next其实就是pairs遍历table时用来取下一个内容的函数.

    在项目的module中最好封装一下,免得module本地也有next函数

    于是封装后判断的lua table是否为空的函数如下:

    function table_is_empty(t)

            return _G.next( t ) == nil

    end

    不过呢,使用next也有注意事项,一并提一下。for循环pairs一个table就是使用的next实现,不过这个循环过程中,不能赋新的元素给table,不然结果就是未知的,不过你可以在循环的过程中改变已有的值,特别地,可以通过赋为nil来删除一个元素。

     1 t = { [1] = 'a', [2] = 'b', [3] = 'c', [32] = 'df', [10] = 'm'}
     2 START = 5
     3 for k, v in pairs(t) do
     4     print(k, v)
     5     if k < START then
     6         t[k + START] = v
     7         t[k] = nil
     8     end
     9 end
    10 
    11 print('****************')
    12 for k, v in pairs(t) do
    13     print(k, v)
    14 end

    执行结果

    next的文档说明如下:

  • 相关阅读:
    IIS 7.0 下 httpMoudle 失效的问题
    iis 管理员执行 aspnet_iis.exe
    java script 闭包
    c# 多语言实现 与 InitializeCulture
    谈 IIS7.5 Asp.Net模拟用户
    oledb 写入 office2010 以及发布到iis 遇到的奇怪问题总结
    DataTableToExcel
    下拉加载数据
    简单使用TFS管理源代码
    a span做成按钮样式不选中文字
  • 原文地址:https://www.cnblogs.com/njucslzh/p/2886876.html
Copyright © 2011-2022 走看看