Lua基本语法

本篇要聊的分为两部分,一部分是运算符,另一部分是基本语法。

Lua的运算符

概况

  • 一元运算符:- 负号,实数符号取反(注: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会被认为是否,其他皆为真。

or

类似其他语言的||,但是返回值是变量
如表达式a or b,则当a为nil或false时,返回b,否则返回a
在Lua中经常有如下写法:

-- 若a不为nil或false,则a为它本身,否则用table初始化a
a = a or {}

-- 其他语言三目运算写法
a = a ?a : {} 或 a = a?: {}

and

类似其他语言的&&,但是返回值是变量
如表达式 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

not

等价于其他语言的,返回值为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")

条件语句

条件语句的关键字是ifthenelseelseif,以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

breakreturn

break用来退出当前循环,循环外部不可使用;return用于从函数返回结果,函数自然结尾处会有个默认的return。

注:在Lua中,break和return只能出现在代码块的结尾,如endelseelseifuntil之前,也就是说不能在一个代码块中间的任意位置使用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

你可能感兴趣的:(Lua)