L1[table]01. table表的定义与赋值

小知识:声明表的例子

xx={}--创建一个空表xx

--给这表的元素赋值
test="a"
xx[test]="a"
xx.b="b"
xx.c="c"
xx.d="d"
xx["e"]="e" ---输出对应的表元素的值
traceprint(xx[test])
traceprint(xx.e) --简单遍历整个表
for k,v in pairs(xx) do traceprint(k,"->",v)
end

注意:表的键key不能是nil 会报错的 如果key是变化的或者某个变量 在用的时候一定要先判断key是不是nil  一定要考虑这个情况

报错信息:D:\Program Files (x86)\zerobrane\bin\lua53.exe: E:\lua\test7.lua:12: table index is nil   .

L1[table]02. table的按址传递。

小知识:普通变量赋值 和表的赋值是完全不同的 对于表的相互赋值有重大影响

a=10

b=a --这里是把a变量的内容10拷贝了一份到了b变量的内存地址里面

a={1,2,3}

b=a --表的赋值 只是把a变量这个表的内存地址 也转给了b变量 如下 单单输出表xx 和表yy 他们   的内容都一样 而且都是指向同一个内存地址  一旦表xx的元素发生变化 因为表xx表yy都是指向同一个内存地址 不是拷贝了一份内容到另外1个内存地址  表xx的元素发生变化  表yy自然也会变动  我个人理解 表xx 表yy其实都是类似c语言下的指针  这个xx yy变量不是存储表元素的内容 而是只是存储记录表元素内容的内存地址  两个表之间的赋值  其实也就是传址

xx={}--创建一个空表xx
traceprint(xx) --table: 00fc9158 显示的是该表在内存的存储地址 而不是表中的变量
yy=xx
traceprint(yy) --table: 00fc9158

核心:表变量内容只是一个指针  里面存储的是指向表内容存储的内存地址  所以 表之间相互的赋值 不过是新表变量获取了一个存储原内容存储的地址而已

解决办法:真要实现完美的表的复制   可以用clone函数来实现

小知识:两个表都指向同一个表地址 一个表为nil 另外一个表是否会受到影响

xx={}--创建一个空表xx
traceprint(xx) --table: 00fc9158 显示的是该表在内存的存储地址 而不是表中的变量
yy=xx
traceprint(yy) --table: 00fc9158 xx=nil
traceprint(xx) --nil 这里只是把表变量xx的内容里面存储的指向表内容的地址 变为nil 但是对指向表内容却没有任何影响
traceprint(yy) --table: 00fc9158

结论 自然是不会 因为设置xx=nil只是把xx指向真正表内容的内存地址清空为nil了 更没影响表内容内存地址里面的东西 但是yy里面依然记得这个内存地址

小知识:那么如何清空表 节约系统资源

只需要把指向该表内容的内存地址的指针变量都设置为nil 虽然表的内容依然存在 但是lua有自动回收机制 这种没有任何指针指向的内存地址内容 自然是在被回收的范围

L1[table]03. table的小数点取值

没什么 不过是引用表元素的表达形式不同而已

xx[“a”]  ==>xx.a

当然 键key 必须是字符串 如果是数值 就无法如此表示了

注意:xx={1,2,3,qq=”234234234”} 注意 以这种形式  qq这个key不能加引号

稍微提一下  xx={1,2,3,qq=”234234234”}   还有另外1个形式可以写  xx={1,2,3,[“qq”]=”234234234”}


小知识:表索引的默认key 没有指定key的 从左到右从1开始数字索引

L1[table]04. table构造器与数组

注意:以前没有注意 遍历表 如果表是nil 整个代码会报错 如果考虑稍微完善一点就是下面的代码 避免代码崩溃

报错信息 D:\Program Files (x86)\zerobrane\bin\lua53.exe: E:\lua\test7.lua:24: bad argument #1 to 'pairs' (table expected, got nil)

--考虑的稍微完善的简单遍历整个表
if (not zz) then
--如果表是nil 那么这里要做针对性处理
else
--不是nil 就可以遍历
for k,v in pairs(zz) do
traceprint(k,"->",v)
end
end

ipairs 是针对数组  数组就是从1开始的连续的数字索引 pairs就是适合各种情况

123

L1[table]05. 数组长度

#

1.表内的数字索引所以算长度 字符串索引不算在长度内

2 在表元素里面值设置nil 这个影响到表元素长度的计算  而且没有什么准确的规律  所以 表的key和value千万不要成为nil  key为nil  会报错 value为nil 不会报错 但是会干扰表长度的计算

结论:#来获取表长度只适合纯数字索引的(并且这个数字索引从1开始)表 要想完整的获取表的长度 可以考虑下面的办法

--功能:获取对应表的长度
--返回值: 返回-1表示当前不是table 大于等于0都是正常的返回(元素内容为nil的不计算在内)
function testlib:len(tableName)
local result=-1
local i=0--负责计数的
if (tableName) then
for v,k in pairs(tableName) do i=i+1
end
result=i else
--如果为nil 那么
end
return result
end

L1[table]06. table小数点与中括号取值区别

L1[table]07. 多重嵌套table

小知识:lua表的分隔符的变化和换行声明表写法

test2={10,
20,
age=14;--都好也可以换成分号 依然没什么影响
address="山东", --直接换行即可 对声明表没影响 按键还需要加_结尾 这里不用
name="zjl" --最后一行可以加逗号 也可以不加
}
for v,k in pairs(test2) do
traceprint(v,"--",k)
end

123

小知识:一个二重表的基本结构 和 简单的调用

test3={

    {id=1,name="zjl",age=14},
{id=2,name="zjl2",age=14},
{id=3,name="zjl3",age=14}, }
traceprint(test3[2].name)

123

L1[table]08. 循环遍历数组

小知识:表之间的比较大小和是否相123等

test4={1,2,3}
test5={1,2,3}
traceprint(test4)
traceprint(test5)
if (test4==test5) then
traceprint("相等")
else
traceprint("不等")
end

结果

test7.lua:74:    table: 01351bd0  --test4这个表变量内容是内存地址 他们指向的内存地址明显不同自然不可能相等

test7.lua:75:    table: 01351c70  --test5这个表变量内容是内存地址

test7.lua:79:    不等

123

L1[table]09. 循环遍历table

小知识:完美的遍历表 嵌套表也可以完美遍历  转载地址:https://blog.csdn.net/u013577276/article/details/77127204

function dumpTable(t, tab)
local str = str or ""
if not t then
print("table is nil")
return str
end tab = tab or " "
tab = tab .. " "
str = str .. "{\n" if type(t) == "table" then
for k, v in pairs(t) do
if type(k) == "number" then
str = str .. string.sub(tab, 2, string.len(tab)) .. "[" .. k .. "]" .. " = "
else
str = str .. string.sub(tab, 2, string.len(tab)) .. "[\"" .. k .. "\"]" .. " = "
end
if type(v) == "string" then
str = str .. "\"" .. v .. "\"" .. "\n"
elseif type(v) == "number" then
str = str .. v .. "\n"
elseif type(v) == "boolean" then
str = str .. tostring(v) .. "\n"
elseif type(v) == "function" then
str = str .. tostring(v) .. "\n"
elseif type(v) == "thread" then
str = str .. "thread : " .. tostring(v) .. "\n"
elseif type(v) == "userdata" then
str = str .. "userdata : " .. tostring(v) .. "\n"
elseif type(v) == "table" then
str = str .. dumpTable(v, tab) .. "\n"
else
str = str .. "unknow : " .. tostring(v) .. "\n"
end
end
str = str .. string.sub(tab, 2, string.len(tab) - 1) .. "}"
else
str = t
end return str
end
---------------------
xx={1,2,3,
{id=13,name="zjl"},
{id=14,name="zjl"},
{id=15,name="zjl"},
{tel=1548924786,
tel1=3423423423,
tel2=1231231,
tel3=1231231,
{address="山东",age=18,name="dfsdf"}
},
"dfsdf",
"dfsdfsdfsdfsdfsdf",
} print(dumpTable(xx))

疑问:类方法的参数 可以正常传递数值 字符串参数 但是表参数传递进去似乎是nil

找了一会资料 没找到这方面的情况

等之后再研究

--测试用类方法
function testlib:test(tableName)
if tableName then
--如果参数不为nil 就遍历出表元素
for v,k in pairs(tableName) do
print(v,k)
end
else
--为nil 则输出下
print("table is nil")
end
end
zjl=require("testlib")--导入该类
yyy={1,2,3,4,5,6,7}
zjl.traceprint("hello")--输出出hello 表明类方法可以在这个源码里面可以使用
zjl.test(yyy)--结果 table is nil

123

L1[table]10. 三目运算符技巧

小知识:一个变量赋值的小技巧 防止一些变量根本不存在或者说是nil的情况导致代码报错崩溃

举个例子比如tonumber()返回就可能是nil 如果我们用tonumber() 强制转化 默认结果是数字 以默认结果来进行处理

就会代码出错

function test1(a)
return tonumber(a)+1
end
print(test1("10"))
print(test1("sas"))

结果

11

D:\Program Files (x86)\zerobrane\bin\lua53.exe: E:\lua\test10.lua:19: attempt to perform arithmetic on a nil value

如果我们用 a=a or 0 这样的格式 就能从逻辑上避免这样的问题 就算转化失败为nil 我们也可以给他赋一个初值 避免报错

function test1(a)

    local a=tonumber(a)
a=a or 0 --这个就是转化为数值后的结果 如果转化成功 则a还是a 转化失败为nil则a默认为0
--这样不管如何a总会是数值 不会导致报错
return a+1
end
print(test1("10"))
print(test1("sas"))

老师的演示例子也展示了表变量避免nil的情况

local tempTbale={}--设置一个空表作为一个表的默认值

xTable=xTable or tempTbale --如果xTable是nil  那么就会给赋值一个空表tempTbale

--到这里为止  不管以前xTable 是不是nil 在这都是一个表了

上面的a=a or 0  或者我们后面要学 x?a:b 这种三目运算符 其实 完全可以用一个函数来解释

function iif(expression,A,B)
local result
if (expression) then
result=A
else
result=B
end
return result
end

L1[table]11. table函数库

1.table.connect()--这个只是针对数组 就是从1开始的连续的数字索引表  其他索引就不操作  而且该函数第二个参数就是分隔符设置 第三个参数是指定从第几个数字索引元素开始  第四个就是合并到哪个数字索引结束  作用是把属于数组的元素全部以某个分隔符一样拼接成字符

2.table.insert()  还是只针对数组  插入末尾 table.insert(yy,”插入的内容”)  插入指定的数字索引位置  table.insert(yy,2,”插入的内容”)

3 table.remove() 和上面相反  经过测试 删除不存在的数字索引 也不会报错

4 table.sort 排序 而且可以设置排序判断的函数

3 table.move (a1, f, e, t [,a2])  等价操作: a2[t],··· = a1[f],···,a1[e]

结论:建议表尽量都使用数字索引 因为table函数库处理的都是数组类型 表类型更加的复杂

123

[lua]紫猫lua教程-命令宝典-L1-01-07. table表的更多相关文章

  1. [lua]紫猫lua教程-命令宝典-L1-01-03. 数值数据

    lua5.3在线手册地址  https://cloudwu.github.io/lua53doc/contents.html#contents 其实我们直接啃手册就够了 推荐如果有基础的先啃手册再看紫 ...

  2. [lua]紫猫lua教程-命令宝典-L1-01-02. 变量

    L1[变量]01. 变量命名规则 命名规则:数字字母下划线构成 但是不能数字开头 不推荐中文名 很多都是不支持中文 但是在一些其他的编辑器里面 比如触摸精灵 之类的 就可以 注意 :变量命名必须要包含 ...

  3. [lua]紫猫lua教程-命令宝典-L1-01-01. Lua环境与IDE

    网上大把的lua教程  不过紫猫老师的教程向来都是讲的非常仔细 所以最近天气已经36+了 魔兽世界还需要冲飞行声望  懒得写单子根本没有单子,正好认认真真的看下紫猫老师的lua教程 紫猫老师的lua教 ...

  4. [lua]紫猫lua教程-命令宝典-L1-01-04. 字符串数据

    L1[字符串]01. 单引号与双引号 没什么说得 字符串:以双引号包含 或者单引号包含 或者[[]]包含 L1[字符串]02. 长文本内容 小知识:如果用[[]]包含字符串内容 但是字符串内容里面 包 ...

  5. [lua]紫猫lua教程-命令宝典-L1-01-10. 自定义函数

    L1[function]01. 定义与调用函数 函数的定义 和概念 没什么可说的 lua的函数声明和调用是有先后顺序的  先声明后调用 函数就是变量的一种 所以可以自由的把函数在变量间相互赋值 不过注 ...

  6. [lua]紫猫lua教程-命令宝典-L1-03-01. 闭包

    L1[闭包]01. 函数的传递赋值 没什么说的 1.函数作为变量来看 可以轻松的声明 相互赋值 2.函数变量本质是 一个内存指针 所以函数变量的相互赋值不是传递的函数本身 而是指向这个函数的内存地址 ...

  7. [lua]紫猫lua教程-命令宝典-L1-01-09. string字符串函数库

    L1[string]01. ASCII码互转 小知识:字符串处理的几个共同的几点 1.字符串处理函数 字符串索引可以为负数 表示从字符串末尾开始算起 所有字符串处理函数的 字符串索引参数都使用 2.所 ...

  8. [lua]紫猫lua教程-命令宝典-L1-01-08. math数学函数库

    L1[math]01. 取绝对值 L1[math]02. 三角函数 小知识:注意 lua下三角函数用的参数是弧度 而不是角度 弧度=角度*pi/180  -->弧度角度换算公式  lua的mat ...

  9. [lua]紫猫lua教程-命令宝典-L1-01-06. 循环结构

    L1[循环]01. for循环结构介绍 只是简单的说了下计数型的for循环结构 for i=1,10,1 do testlib.traceprint(i) end 注意几点: 1.上面的1和10表示循 ...

随机推荐

  1. windows密码抓取工具-mimikatz

    前言 介绍一下windows的密码hash值的组成: Windows系统下的hash密码格式为:用户名称:RID:LM-HASH值:NT-HASH值,例如: Administrator::C8825D ...

  2. 题解 AT4556 【12/22】

    题目传送门. ___________ 主要思路 我们可以使用\(C++\)语言中的\(string\)字符串来解. 先定义一个字符串\(s\),并输入\(s\). string s; cin>& ...

  3. 2019-2020-2 《网络对抗技术》Exp0 环境搭建-Kali Linux 的安装

    2019-2020-2 20175334 环境搭建-Kali Linux 的安装 一.Kali的下载与安装 在Kali官网中下载镜像文件 打开Vmware开始创建新虚拟机 选择镜像文件 选择操作系统 ...

  4. C# LINQ学习笔记四:LINQ to OBJECT之操作文件目录

    本笔记摘抄自:https://www.cnblogs.com/liqingwen/p/5816051.html,记录一下学习过程以备后续查用. 许多文件系统操作实质上是查询,因此非常适合使用LINQ方 ...

  5. python qrcode二维码生成与识别

    二维码 二维码生成 1.用法 https://github.com/lincolnloop/python-qrcode 2.使用 简单实用 import qrcode # 二维码内容 data = & ...

  6. 【巨杉数据库SequoiaDB】企业级和开源领域“两开花”,巨杉引领国产数据库创新

    2019年12月15日,OSC 源创会·年终盛典在深圳圆满举行.巨杉数据库作为业界领先的金融级分布式数据库厂商, 获得 “2019年开源数据库先锋企业” 及 “2019 GVP-Gitee最有价值开源 ...

  7. 【巨杉数据库SequoiaDB】巨杉再获企业级认可,分布式数据库领跑“一亿中流”

    据全球最具权威的IT研究与顾问咨询公司 Gartner 预测,DBMS(数据库管理系统)市场从2017年到2018年增长了18.4%,达到461亿美元,这是有史以来最大幅的增长,并有望在2019年超过 ...

  8. POJ2528Mayor's posters 线段树,离散化技巧

    题意:一个坐标轴从1~1e7,每次覆盖一个区间(li,ri),问最后可见区间有多少个(没有被其他区间挡住的) 线段树,按倒序考虑,贴上的地方记为1,每次看(li,ri)这个区间是否全是1,全是1就说明 ...

  9. [AHOI2002] 芝麻开门 - 数论

    求 \(n^k\) 的因子和, \(n \leq 2^{16}, k \leq 20\) Solution \[\prod_i \frac{p_i^{q_ik+1}-1}{p_i-1}\] #incl ...

  10. 判断是否网络连通 .net Ping

    using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using S ...