openresty开发系列15--lua基础语法4表table和运算符
一)table (表) Table 类型实现了一种抽象的"关联数组"。即可用作数组,也可以用作map。 lua中没有数组和map,都是用table这个类型
--数组 java int[] intArr = new int[]{1,2,3,4,5,6}; intArr[0] intArr[1] --map----> key value
HashMap map map.add(key,value)
-- 初始化表 mytable = {}
-- 指定值 mytable[1]= "Lua" mytable[2]= "Lua2" mytalbe["k1"] = v1;
-- 移除引用 mytable = nil -- lua 垃圾回收会释放内存
lua类似数组的table ,索引值从1开始,,而不是0 mytable={1,2,3,4,5} mytalbe[1]
mytable={"a","b","hello","world"}
mytable1 = {key1 = "v1",k2="v2",k3="v3"}
mytable2 = {"a",key1 = "v1","b",k2="v2",k3="v3","hello","world"}
print(mytable[1],mytable[2],mytable[3],mytable[4]); print("------------------") print(mytable1["key1"],mytable1["k2"],mytable1["k3"]); print("------------------") print(mytable2[1],mytable2["key1"],mytable2[2],mytable2["k2"],mytable2[3],mytable2[4]);
talbe key可以为 number 或字符串,,也可以是其他类型
table 是内存地址 赋值给变量
二)table进行赋值给变量,其实是把内存地址给了变量,变量只是引用了内存地址
local mytable1 = {"a",key1 = "v1","b",k2="v2",k3="v3","hello","world"}
local mytable2 = mytable1
mytable2[1] = "aa"
print(mytable2[1])
print(mytable1[1])
mytable2 = nil --移除的是引用
print("-------------") print(mytable1[1])
内存指针--》C++
lua算数运算符
一)算术运算符
+ 加法 - 减法 * 乘法 / 除法 % 取余 ^ 乘幂 - 负号
print(1 + 2) -->打印 3 print(5 / 10) -->打印 0.5。 这是Lua不同于c语言的 print(5.0 / 10) -->打印 0.5。 浮点数相除的结果是浮点数 -- print(10 / 0) -->注意除数不能为0,计算的结果会出错 print(2 ^ 10) -->打印 1024。 求2的10次方
local num = 1357 print(num % 2) -->打印 1 print((num % 2) == 1) -->打印 true。 判断num是否为奇数 print((num % 5) == 0) -->打印 false。判断num是否能被5整数
二)关系运算符
== 等于,检测两个值是否相等,相等返回 true,否则返回 false ~= 不等于,检测两个值是否相等,相等返回 false,否则返回 true 不想java !=,,~= > 大于,如果左边的值大于右边的值,返回 true,否则返回 false < 小于,如果左边的值大于右边的值,返回 false,否则返回 true >= 大于等于,如果左边的值大于等于右边的值,返回 true,否则返回 false <= 小于等于, 如果左边的值小于等于右边的值,返回 true,否则返回 false
print(1 < 2) -->打印 true print(1 == 2) -->打印 false print(1 ~= 2) -->打印 true local a, b = true, false print(a == b) -->打印 false
注意:table, userdate 和函数;判断的是引用地址的判断 local a = { x = 1, y = 0} local b = { x = 1, y = 0} if a == b then print("a==b") else print("a~=b") end
三)逻辑运算符 and 逻辑与操作符。(A and B) 若 A 为 假,则返回 A,否则返回 B or 逻辑或操作符。(A or B) 若 A 为 真,则返回 A,否则返回 B not 逻辑非操作符。与逻辑运算结果相反,如果条件为 true,逻辑非为 false。 永远只返回 true 或者 false
local c = nil local d = 0 local e = 100
print(c and d) -->打印 nil print(c and e) -->打印 nil print(d and e) -->打印 100
print(c or d) -->打印 0 print(c or e) -->打印 100 print(d or e) -->打印 0
print(not c) -->打印 true print(not d) -->打印 false
短路取值 原理 and 与,,,if(a and b and c)
a and b and c a为真,b为真,c为真 返回c a为真,b为假,c为真 返回b a为假 bc不管bc为什么值 返回a
一路去判断变量值是否为真,一旦遇到某个变量为假,就立刻短路返回 返回值就是 假的变量值
a or b or c 一路判断变量值是否为真,一但遇到某个变量为真,就立刻短路返回,返回值就是 真的变量值 a为真,bc 返回a
a为假,b为真,不管c是什么值 返回b
四)其他运算符 .. 连接两个字符串 a..b ,其中 a 为 "Hello " , b 为 "World", 输出结果为 "Hello World"。 # 一元运算符,返回字符串或表的长度。 #"Hello" 返回 5
很多字符串连接 我们如果采用..这个运算符 ,性能是很低
推荐使用 table 和 table.concat() 来进行很多字符串的拼接
五)优先级 ^ not # - * / % + - .. < > <= >= == ~= and or ------------------------ local a, b = 1, 2 local x, y = 3, 4 local i = 10 local res = 0 res = a + i < b/2 + 1 -->等价于res = (a + i) < ((b/2) + 1) res = 5 + x^2*8 -->等价于res = 5 + ((x^2) * 8) res = a < y and y <=x -->等价于res = (a < y) and (y <= x)
|
请发表评论