-- and 和or not --[[ 逻辑运算符认为false和nil是假(false),其他为真,0也是true. and和or的运算结果不是true和false,而是和它的两个操作数相关。 a and b -- 如果a为false,则返回a,否则返回b a or b -- 如果a为true,则返回a,否则返回b 例如: print(4 and 5) --> 5 print(nil and 13) --> nil print(false and 13) --> false print(4 or 5) --> 4 print(false or 5) --> 5 一个很实用的技巧:如果x为false或者nil则给x赋初始值v x = x or v 等价于 if not x then x = v end and的优先级比or高。 C语言中的三元运算符 a ? b : c 在Lua中可以这样实现: (a and b) or c not的结果只返回false或者true print(not nil) --> true print(not false) --> true print(not 0) --> false print(not not nil) --> false --]] --[[ Table : 构造器是创建和初始化表的表达式。表是Lua特有的功能强大的东西。最简单的构造函数是{},用来创建一个空表。可以直接初始化数组: days = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"} Lua将"Sunday"初始化days[1](第一个元素索引为1),用"Monday"初始化days[2]... print(days[4]) --> Wednesday 构造函数可以使用任何表达式初始化: tab = {sin(1), sin(2), sin(3), sin(4), sin(5),sin(6), sin(7), sin(8)} 如果想初始化一个表作为record使用可以这样: a = {x=0, y=0} <--> a = {}; a.x=0; a.y=0,--注意打印输出的顺利,并不是赋值的顺序,实例: print("===========table value=============") local a = {} a.z = 3 a.m = 4 a.n = 5 a.x = 1 a.y = 2 for k,v in pairs(a) do print(k.."="..v) end -----------------------输出:--------- ===========table value============= y=2 x=1 z=3 m=4 n=5 不管用何种方式创建table,我们都可以向表中添加或者删除任何类型的域,构造函数仅仅影响表的初始化。 w = {x=0, y=0, label="console"} x = {sin(0), sin(1), sin(2)} w[1] = "another field" x.f = w print(w["x"]) --> 0 print(w[1]) --> another field print(x.f[1]) --> another field w.x = nil -- remove field "x" 每次调用构造函数,Lua都会创建一个新的table,可以使用table构造一个list: list = nil for line in io.lines() do list = {next=list, value=line} end 这段代码从标准输入读进每行,然后反序形成链表。下面的代码打印链表的内容: l = list while l do print(l.value) l = l.next end 在同一个构造函数中可以混合列表风格和record风格进行初始化,如: polyline = {color="blue", thickness=2, npoints=4, {x=0, y=0}, {x=-10, y=0}, {x=-10, y=1}, {x=0, y=1} } 这个例子也表明我们可以嵌套构造函数来表示复杂的数据结构. print(polyline[2].x) --> -10 上面两种构造函数的初始化方式还有限制,比如你不能使用负索引初始化一个表中元素,字符串索引也不能被恰当的表示。下面介绍一种更一般的初始化方式,我们用[expression]显示的表示将被初始化的索引: opnames = {["+"] = "add", ["-"] = "sub", ["*"] = "mul", ["/"] = "div"} i = 20; s = "-" a = {[i+0] = s, [i+1] = s..s, [i+2] = s..s..s} print(opnames[s]) --> sub print(a[22]) --> --- list风格初始化和record风格初始化是这种一般初始化的特例: {x=0, y=0} <--> {["x"]=0, ["y"]=0} {"red", "green", "blue"} <--> {[1]="red", [2]="green", [3]="blue"} 如果真的想要数组下标从0开始: days = {[0]="Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"} 注意:不推荐数组下标从0开始,否则很多标准库不能使用。 在构造函数的最后的","是可选的,可以方便以后的扩展。 a = {[1]="red", [2]="green", [3]="blue",} 在构造函数中域分隔符逗号(",")可以用分号(";")替代,通常我们使用分号用来分割不同类型的表元素。 {x=10, y=45; "one", "two", "three"} --]] print (1 and 3) --前值为真,则返回后值,否则返回前值 print (false and 3) print (1 or 3) -- 前值为真,则返回前值,否者返回后值 print (nil and 3) print(not nil) --只会返回true 或 false print(not 1) print (not false) --循环语句 -- 在lua中没有++ 和 -- --while mttable = {1,2,2,3} local i = 1 while mttable[i] do print (mttable[i]) i = i+ 1 end --repeat local sum = 1 repeat sum = sum + 1 print (sum) until sum == 3 --for for i=1,10,2 do print(i) end --table的用法 --lua中索引从1开始的不是从0开始的 --table访问的方式和我们在其他语言中的数组的方式很像 mytable = {} mytable2 = { 2, 3, 4, 5, "string", --索引号是5 config = {1,2,3},--注意config的索引号不是7是一个地址号 8 --索引号是6 } for k,v in mytable2 do print (k,v) end for i=1,#mytable2 do print(mytable2[i]) end s = "ok" mytable = { 1, 2, k = "s", config = {}, 4, 5 } mytable[s] = 10 print (mytable["k"]) print (mytable[s]) print (mytable.k) --在lua中mytable.k等于mytable["k"] --a.x a[x] --[[ a.x 等价于 a["x"] a[x]以变量x的值来索引table ]] --第一种遍历方式 ,普通方式遍历表 for i=1 , #mytable do print (mytable[i]) end --第二种遍历方式 --for ipairs ipairs迭代器和for的方式获取的值是一样的, --都是按照隐式的索引去迭代来获取值的 for i,v in ipairs(mytable) do print(i, v) end --第三种遍历的方式 他会把全部的索引都显示出来, --但是注意他的顺序,并不是完全按照写的顺序来的 for k,v in pairs(mytable) do print(k, v) end --1 作为第三方的插件集成到项目中,为我们的项目提供支持功能 --2 可以完全用lua来进行开发,例如quick-cocos2dx 、CoronaSDK --3 当做一种数据的配置集(就是阵列) enemy_waves = { { entierId = 1, infoid = 1}, { entierId = 2, infoid = 1}, { entierId = 2, infoid = 3}, { entierId = 3, infoid = 3}, { entierId = 4, infoid = 3}, { entierId = 1, infoid = 1} } enemy_datas = { { maxHp = 100, damage = 100, isHaveSpecialEffect = true}, { maxHp = 100, damage = 100, isHaveSpecialEffect = true}, { maxHp = 100, damage = 100, isHaveSpecialEffect = true} } for k,v in pairs(enemy_datas) do -- print(k, v) if type(v) == "table" then for ik, iv in pairs(v) do print(ik, iv) end end print("++++++++++++++") end