Lua 语言入门
标识符和变量
Lua 支持以英文字母和下划线开头的标识符作为变量或函数名。
乐白机器人的 Lua 解释器对这一规则进行了扩展,支持 UTF-8 字符作为标识符。
Lua 中,全局变量无需声明即可使用,默认值为 nil
,没有数量限制。使用局部变量需在声明语句前加 local
,最多可以声明 200 个局部变量。局部变量和全局变量都会在程序运行完成后进行垃圾回收。
以下语句在乐白机器人中都是合法的:
local a = 0
b = a
_test = {}
变量 = b
注释
单行注释以 --
开始:
-- 我是注释
多行注释在 --
后加上两个方括号 [[
]]
即可:
--[[
多行注释
第二行
--]]
取消多行注释只需要在 --[[
前加一个 -
:
---[[
a = 0
b = a + 1
--]]
类型和值
Lua 是动态类型语言,可以用 type()
函数获取类型。Lua 有如下 8 种基本类型:
- 空
type(nil) --> nil
- 布尔
type(true) --> boolean
- 数值
type(10.4 * 3) --> number
- 字符串
type("你好 世界") --> string
- 用户数据
type(io.stdin) --> userdata
- 函数
type(print) --> function
- 表
type({}) --> table
- 线程
thread
全局变量未声明即为 nil
,将变量赋值为 nil
即删除该变量。
Lua 中,条件测试将 false
和 nil
之外的值均视为真。支持双目运算符 and
(和)or
(或),以及单目运算符 not
(非)。
常用如下语句进行变量初始化:
count = (count or 0) + 1
这等价于:
if not count then
count = 0
end
count = count + 1
数值
在 Lua 5.2 中,数值类型不区分整型和浮点型,均以双精度浮点格式表示。
Lua 5.3 开始支持整数类型。
数值常量
十进制表示和科学计数法:
assert(1 == 1.0)
assert(-3 == -3.0)
assert(0.2e3 == 200)
assert(4.57e-3 == 0.00457)
十六进制表示和格式化:
assert(0xff == 255)
assert(0x1A3 == 419)
assert(0x0.2 == 0.125)
assert(0x1p-1 == 0.5)
assert(0xa.bp2 == 42.75)
string.format("%a", 419) -- 0x1.a3p+8
string.format("%a", 0.1) -- 0x1.999999999999ap-4
运算和数学库
算术运算:
assert(13 + 15 == 28) -- 加法
assert(13.0 + 25 == 38.0) -- 加法
assert(-(3 * 6.0) == -18.0) -- 减法、乘法、负数
assert(3 / 2 == 1.5) -- 除法
assert(3 // 2 == 1) -- 整除 (Lua 5.3)
assert(3 assert(2 ^ 3 == 8) -- 幂
关系运算:
assert(1 + 1 == 2) -- 相等
assert(1 + 1 ~= 3) -- 不等
assert(1 < 3) -- 小于
assert(1 <= 3) -- 小于等于
assert(3 > 1) -- 大于
assert(3 >= 1) -- 大于
随机数生成:
math.randomseed(os.time()) -- 设置随机数种子
print(math.random()) -- 产生 [0,1) 的随机数
print(math.random(6)) -- 产生 [1,6] 的随机数
print(math.random(10, 20)) -- 产生 [10, 20] 的随机数
取整函数:
assert(math.floor(3.3) == 3) -- 向下取整
assert(math.ceil(3.3) == 4) -- 向上取整
a, b = math.modf(3.5) -- 向零取整
assert(a == 3 and b == 0.5)
角度和三角函数:
deg = 30
rad = math.rad(deg) -- 角度转弧度
print(math.deg(rad)) -- 弧度转角度
sin = math.sin(rad) -- 正弦
print(math.asin(sin)) -- 反正弦
cos = math.cos(rad) -- 余弦
print(math.acos(cos)) -- 反余弦
tan = math.tan(rad) -- 正切
print(math.atan(tan)) -- 反正切
其他数学函数:
assert(math.abs(-1) == 1) -- 绝对值
assert(math.min(1, 2, 3) == 1) -- 最小值
assert(math.max(1, 2, 3) == 3) -- 最大值
assert(math.sqrt(4) == 4^0.5) -- 平方根
print(math.exp(10)) -- e^10
print(math.log(10)) -- 以e为底10的对数
print(math.log(10, 2)) -- 以2为底10的对数
数学常量:
print(math.pi) -- 圆周率
print(math.huge) -- 极大值
错误处理
当发生错误时,如果不捕获错误加以处理,任务将异常退出。
Lua中处理错误,可以使用函数pcall(protected call)来包装需要执行的代码。
语法格式如下:
success, result1, result2, ... = pcall(function, arg1, arg2, ...)
示例:
function divide(a, b)
if b == 0 then
error("Cannot divide by zero")
end
return a / b
end
success, result = pcall(divide, 10, 0)
if not success then
print("Error occurred: ", result)
else
print("Result: ", result)
end