Lua 语法

数据类型


Lua 是一个动态类型语言,一个变量可以存储任何类型的值。

Lua 常用数据类型

类型名 取值
空 nil 空类型只包含一个值,即 nil。nil 表示空,所有没有赋值的变量或表的字段都是 nil。
布尔 boolean 布尔类型包含 true 和 false 两个值
数字 number 整数和浮点数都是使用数字类型存储,如1、0.2、3.5e20 等。
字符串 string 它与 Redis 的键值一样都是二进制安全的。
表 table 表类型是 Lua 语言中唯一的数据结构,既可以当数组又可以当字典,十分灵活
函数 function 函数在 Lua 中是一等值,可以存储在变量中作为函数的参数或返回结果。

变量


Lua 的变量分为全局变量和局部变量。全局变量无需声明就可以直接使用,默认值是 nil。

a = 1 -- 为全局变量 a 赋值
print(b) -- 无需声明即可使用,默认值是 nil
a = nil -- 删除全局变量 a 的方法是将其赋值为 nil。全局变量没有声明和未声明之分,只有非 nil 和 nil 的区别

声明局部变量的方法为local 变量名

local c -- 声明一个局部变量 c,默认值是 nil
local d = 1 -- 声明一个局部变量 d 并赋值为 1
local e, f -- 可以同时声明多个局部变量

声明一个存储函数的局部变量的方法为

local say_hi = function ()
	print 'hi'
end

注释


Lua 的注释有单行和多行两种。

单行注释:-- 注释内容

多行注释 :-- [[ 多行注释内容 ]]

赋值


Lua 支持多重赋值

local a, b = 1, 2 -- a 的值是1,b 的值是2
local c, d = 1, 2, 3 -- c 的值是1,d 的值是2,3 被舍弃
local e,f = 1 -- e 的值是1,f 的值是 nil

在执行多重赋值时,lua 会先计算所有表达式的值

local a = {1, 2, 3}
local i = 1
i, a[1] = i + 1, 5

上面最后一个赋值语句变为了i, a[1] = 2, 5 所以赋值后 i 的值为 2,a 则为 {5, 2, 3}

操作符


数学操作符

包括常见的 +、-、*、/、%(取模)、-(一元操作符,取负)、^(幂运算符)

比较操作符

操作符 说明
== 比较两个操作数的类型和值是否相等
~= 与 == 的结果相反
< > <= >= 小于 大于 小于等于 大于等于

逻辑操作符

操作符 说明
not 根据操作数的真和假相应地返回 false 和 true (取返)
and a and b中如果 a 是真则返回 b,否则返回 a
or a or b中如果 a 是假则返回 a 否则返回 b
print(1 and 5) -- 5
print(1 or 5) -- 1
print(not 0) -- false
print('' or 1) -- ''

Lua 的逻辑操作符支持短路,也就是说 false and foo(),Lua 不会调用 foo 函数,因为第一个操作数已经决定了无论 foo 函数返回的结果是什么,该表达式的值都是 false。or 操作符与之类似。

连接操作符

连接操作符只有一个..用于连接两个字符串。

print('hello'..' '..'world!') -- 'hello world!'
print('The price is '.. 25) -- 'The price is 25'

取长度操作符

#用来获取字符串或表的长度

print(#'hello') -- 5

各个运算符的优先级顺序如下表(优先级依次降低)

^
not # - (一元)
* / %
+ -
..
< > <= >= ~= ==
and
or

if 语句


Lua 的 if 语句格式如下:

if 条件表达式 then
	语句块
elseif 条件表达式 then
	语句块
else
	语句块
end

循环语句


Lua 支持while repeat for循环语句。

while 语句形式

while 条件表达式 do
	语句块
end

repeat 语句形式

repeat
	语句块
until 条件表达式

for 语句形式

数字形式

for 变量 = 初值, 终值, 步长 do
	语句块
end
-- 其中步长可以省略,默认步长为1。

通用形式

for 变量1, 变量2, ..., 变量N in 迭代器 do
	语句块
end

表类型


表是 Lua 中唯一的数据结构,可以理解为关联数组,任何类型的值(除了空类型)都可以作为表的索引。

表的定义方式

a = {} -- 将变量 a 赋值为一个空表
a['field'] = 'value' -- 将 field 字段赋值 value
print(a.field) -- => 'value',a.field 是 a['field'] 的语法糖

-- 也可以这样定义
people = {
	name = 'Bob',
	age = 29
}
print(people.name) -- => 'Bob'

当索引为整数的时候表和传统的数组一样

a ={}
a[1] = 'Bob'
a[2] = 'Jeff'

-- 也可以写成下面这样
a = {'Bob', 'Jeff'}
print(a[1]) -- => 'Bob'

使用通用形式的 for 语句遍历数组

local a = {'Bob', 'Jeff'}
for index, value in ipairs(a) do 
	print(index)
	print(value)
end

-- 打印结果如下
-- 1
-- Bob
-- 2
-- Jeff
-- ipairs 是 Lua 内置的函数,实现类似迭代器的功能。

使用数字形式的 for 语句遍历数组

local a = {'Bob', 'Jeff'}
for i = 1, #a do
	print(i)
	print(a[i])
end

-- 打印结果如下
-- 1
-- Bob
-- 2
-- Jeff
-- #a 的作用是获取表 a 的长度

使用迭代器 pairs 遍历非数组的表值

local people = {
	name = 'Bob',
	age = 29
}

for index, value in pairs(people) do
	print(index)
	print(value)
end

-- 打印结果如下
-- name
-- Bob
-- age
-- 29

pairs 与 ipairs 的区别在于前者会遍历所有值不为 nil 的索引,而后者只会从索引 1 开始遍历到最后一个值不为 nil 的整数索引。

函数


函数的定义

function (参数列表)
	函数体
end

-- 可以将其赋值给一个局部变量
local square = function (num)
	return num * num
end

-- 使用语法糖简化函数的定义
local function square (num)
	return num * num
end

形参为...获取所有实参列表

local function square (...)
	local argv = {...}
	for i = 1, #argv do
		argv[i] = argv[i] * argv[i]
	end
	return unpack(argv)
end

a, b, c = square(1, 2, 3)
print(a)
print(b)
print(c)

-- 定义结果如下
-- 1
-- 4
-- 9

在 Lua 中 return 和 break(用于跳出循环)语句必须是语句块中的最后一条语句,简单地说在这两条语句后面只能是 end、else 或 until 三者之一。如果希望在语句块中间使用这两条语句的话可以人为地使用 do 和 end 将其包围。

你可能感兴趣的:(lua,开发语言)