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 种基本类型:

  1. type(nil) --> nil
  2. 布尔 type(true) --> boolean
  3. 数值 type(10.4 * 3) --> number
  4. 字符串 type("你好 世界") --> string
  5. 用户数据 type(io.stdin) --> userdata
  6. 函数 type(print) --> function
  7. type({}) --> table
  8. 线程 thread

全局变量未声明即为 nil,将变量赋值为 nil 即删除该变量。

Lua 中,条件测试将 falsenil 之外的值均视为真。支持双目运算符 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