本篇要聊的分为两部分,一部分是运算符,另一部分是基本语法。
一元运算符:- 负号,实数符号取反
(注:Lua中没有++和–)
二元运算符:+ 加, - 减, * 乘, / 除, ^幂运算,% 取余
关系运算符:> 大于,< 小于,>= 大于等于,<= 小于等于,== 等于 ,~= 不等于
(注:不等于是~=)
逻辑运算:or 或;and 与;not 非
(注:Lua中的逻辑运算符不是||、&&和!)
位运算:(注:仅MLN中中有效)
MBit:bor()
按位“或”,等价其他语言的|
;
MBit:band()
按位“与”,等价其他语言的&
;
MBit:bxor()
按位“异或”, 等价于其他语言的^
;
MBit:neg()
按位“非”,等价于其他语言的~
;
Mbit:shl(num, bit)
按位“左移”,等价于其他语言的<<
,第一个参数为要操作的数,第二个参数为移动位数;
MBit:shr(num, bit)
按位右移,等价于其他语言的>>
,第一个参数为要操作的数,第二个参数为移动位数;
Lua未提供其他语言支持的三目运算符,但是可以通过逻辑运算符来模拟,之所以能这样是因为Lua的逻辑运算符返回值并不是true和false,而是变量本身。
在介绍Lua逻辑运算符的返回值之前,再重申一次:在Lua中只有nil和false会被认为是否,其他皆为真。
类似其他语言的||
,但是返回值是变量
如表达式a or b
,则当a为nil或false时,返回b,否则返回a
在Lua中经常有如下写法:
-- 若a不为nil或false,则a为它本身,否则用table初始化a
a = a or {}
-- 其他语言三目运算写法
a = a ?a : {} 或 a = a?: {}
类似其他语言的&&
,但是返回值是变量
如表达式 a and b
,则当a为nil或false时,返回a,否则返回b
在Lua中常有如下写法:
-- 模拟三目运算符
-- 等价于其他语言的 c = isTrue ? a : b,但是有个前提是b不能为false或nil
c = isTrue and a or b
-- 解释:若isTrue为nil或false,则isTrue and a为isTrue,即返回isTrue or b的结果
-- 若isTrue不为nil或false,则isTrue and a 返回a, 即结果返回a or b的结果
测试代码test.lua如下:
local a = 10
local b = 20
local isTrue = false
local c = isTrue and a or b
print("1:", c)
isTrue = true
c = isTrue and a or b
print("2:", c)
a = nil
c = isTrue and a or b
print("3:", c)
-- 输出如下
xxxx Desktop $ lua ./test.lua
1: 20
2: 10
3: 20
等价于其他语言的!
,返回值为true或false。
在lua中常有如下写法:
local condition = false
if not condition then
print("condition is nil or false !")
end
在Lua中只有nil和false会被认为是否,其他皆为真。
local a = 10 -- 将10赋值给变量a
a = "hello world" -- 将hello world赋值给变量a
-- 注:Lua是动态类型语言,定义变量时不需要指定类型
-- 支持一行语句赋多个值
local b, c, d = 10, 20, 30
print(b, c, d) -- 10 20 30
-- 变量和值对齐原则
local f, g = 10
print(f, g) -- 10 nil, g为被赋值
local h, i = 10, 20, 30
print(h, i) -- 10 20, 30被丢弃
-- 函数支持多个返回值
function test()
return 10, 20
end
local j, k = test
print(j, k) -- 10, 20
函数以function
关键字标识,end
结束,Lua函数支持任意数量的参数和任意数量的返回值,但不支持函数重载。
-- 无参无返回值
function test()
-- do something
end
-- 有限个参数,有限个返回值
function test1(prm1, prm2, prm3)
-- do something
-- 有多个返回值的情况下,返回之间用,隔开
return result1, result2
end
-- 调用
test1() -- 不传参,则prm1、prm2、prm3均为nil
test1(1, "hallo") -- prm1为1,prm2为"hello", prm3为nil
-- 函数作为参数
function test2(unm, block)
-- 若num为nil,则num初始化为0
num = num or 0
-- 通过三目运算取绝对值
num = (num > 0) and num or - num
block(num)
end
-- 调用
test2(-10, function(result)
print(resulr) -- 10
end)
-- 任意个参数
function test3(...)
-- 建议用{}将...包起来,免得出问题
local args = {...}
for i, v in ipairs() do
print(i, v) -- 打印参数
end
end
test3("a", "b", "c")
test3("a", "b", "c", "d")
条件语句的关键字是if
,then
,else
,elseif
,以end
结束
-- 事例1
if condition then
-- do sth
end
-- 事例2
if condition1 then
-- do sth
elseif condition2 then
-- do sth
end
---------- while循环 ----------
local i = 1
while i < 10 then
i = i + 1
end
---------- repeat循环 ----------
repeat
print(a)
a = a + 1
until a >= 10
-- 特殊用法,repeat代码只执行一次,可以减少if-else的嵌套层级
repeat
if conditionA then break end
do something
if confitionB then break end
do something
until(true)
---------- for循环 ----------
for local i = 1, 10 do
print(i)
end
-- 定义表tab
local tab = {"aa", "bb", "cc"}
tab.name = "小明"
tab.age =18
-- 循环遍历Array部分
-- ipeirs只根据顺序遍历table中数组部分
for i, v in ipairs(tab) do
-- i为索引,v为索引对应的value
print(i, v)
end
-- 运行结果
1 aa
2 bb
3 cc
-- 循环遍历table(包括Array部分和Map部分)
for k, v in pairs(tab) do
-- i为索引,v为索引对应的value
print(k, v)
end
-- 结果
1 aa
2 bb
3 cc
name 小明
age 18
break
和return
break用来退出当前循环,循环外部不可使用;return用于从函数返回结果,函数自然结尾处会有个默认的return。
注:在Lua中,break和return只能出现在代码块的结尾,如end
、else
、elseif
、until
之前,也就是说不能在一个代码块中间的任意位置使用break或return
function test(a, b)
local c = a + b
a = c - a
-- 如果因调试需要,需要在中间某个位置终止函数的执行,直接用return会出现错误
-- return a, b -- 此用法会报错
do return a, b end -- 此时,只需要将return用do-end块包起来就可以了
b = c - a
return a, b
end
全局变量不需要声明,给一个变量赋值后就创建了一个全局变量
局部变量需要使用local
关键字声明
在函数内使用与全局变量同名的局部变量,对全局变量无影响。
注:全局变量是相对于虚拟机来讲的,一个虚拟机是一个独立的lua运行环境,虚拟机之间在内存上是彼此隔离的,不能彼此访问对方的数据。如需访问,需要对虚拟机做些操作,后面有机会再唠这个话题吧。
-- 声明全局变量a,a全局存在,无论什么地方都可以使用
a = 10
-- 声明局部变量b, b只能在声明的文件内或者函数内使用,作用域外无法引用
local b = 10
原文goto