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 |
Lua 的 if 语句格式如下:
if 条件表达式 then
语句块
elseif 条件表达式 then
语句块
else
语句块
end
Lua 支持while
repeat
for
循环语句。
while 条件表达式 do
语句块
end
repeat
语句块
until 条件表达式
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'
local a = {'Bob', 'Jeff'}
for index, value in ipairs(a) do
print(index)
print(value)
end
-- 打印结果如下
-- 1
-- Bob
-- 2
-- Jeff
-- ipairs 是 Lua 内置的函数,实现类似迭代器的功能。
local a = {'Bob', 'Jeff'}
for i = 1, #a do
print(i)
print(a[i])
end
-- 打印结果如下
-- 1
-- Bob
-- 2
-- Jeff
-- #a 的作用是获取表 a 的长度
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 将其包围。