1.简介

参考:Lua 5.3 参考手册open in new window

注意

  • Lua 的逻辑判断只有 falsenil 为假,其他都为真。
  • Lua 不支持运算符 ++--+=-=*=/=,不等运算符用 ~= 表示,逻辑运算符用 andornot 表示。
  • Lua 表的数字下标(属性)默认从 1 而不是 0 开始。

Lua 是类似 JavaScript 的一门弱类型脚本语言,所有变量的类型都是根据运行时赋予的值确定。你可以使用 在线运行open in new window 实时体验 Lua 脚本。

2.变量声明

-- 单行注释
--[[
多行注释
]]

-- 1.全局变量:在整个项目中生效,lua 中声明和赋值可以同时进行,可以同时声明赋值多个变量
a = 1

-- 2.局部变量:在局部作用域中生效(文件、函数、代码块等)
local b = 2
local c, d, e = 3, 4 -- 3, 4, nil

3.数据类型

基础类型

Lua 的基本数据类型有 Nil、Number、String、Boolean、Table、Function 六种,这里为了分类方便只列出前四种。

-- 1.空 Nil:没有声明或赋值的变量都是 nil 类型
local null = nil -- nil

-- 2.数字 Number:支持十进制、十六进制、科学计数法
local num1 = 3.14159 -- 十进制
local num2 = 0x11 -- 十六进制
local num3 = 2e3 -- 科学计数法(2*10^3 = 2000)
local num4 = tonumber('10') -- 字符串 -> 数字(转换失败返回 nil,例如传入 'a')

-- 3.字符串 String
local str1 = '字符串\n字符串' -- 普通字符串(转义字符生效)
local str2 = [[字符串\n字符串
字符串\n字符串
]] -- 原始字符串(转义字符不生效)
local str3 = '字符串'..'字符串' -- 字符串拼接
local str4 = tostring(10) -- 数字 -> 字符串
local str5 = string.char(0x30, 0x31, 0x32, 0x33) -- ASCII 码 -> 字符串
#str1 -- 字符串字节长度(1 中文 = 3 字节,1 转义字符 = 1 字节)

 -- 4.布尔型 Boolean:只有真或假,lua 中只有 false、nil 为假,其他都为真
local bool1 = true
local bool2 = false

表类型 Table

表是 Lua 中唯一的数据结构,可以存储任意类型的数据(数组、集合、对象等),在 Lua 中所有全局变量都是全局表 _G 的属性

-- 一.全局表
-- 1.概念:lua 中所有声明的全局变量都在一个特殊的表中,称为全局表
_G -- table: 0x3
-- 2.访问全局变量
a = 1
b = 2
_G['a'] -- 1
_G['b'] -- 2
-- 3.访问全局 API
_G['table'] -- table: 0x10
_G['table']['insert'] -- function: 0x153

-- 二.普通表(数字下标)
-- 1.声明:lua 的表可以存储各种数据类型
table1 = { 1, 'a', {}, function() end }
-- 2.读取:下标从 1 开始
table1[0]、table1[5] -- nil(越界取值为 nil)
table1[1] -- 1
table1[2] -- 'a'
table1[3] -- table: 0x154
table1[4] -- function: 0x155
-- 3.赋值
table1[5] = 123
-- 4.长度
#table1 -- 5
-- 5.新增元素
table.insert(table1, 'd') -- 表新增元素(下标 + 1)
table.insert(table1, 2, 'c') -- 表指定位置新增元素
-- 6.删除元素
local item = table.remove(table1, 2) -- 表指定位置移除元素并返回该元素

-- 三.普通表(字符串下标)
-- 1.声明:lua 的表可以存储各种数据类型
table2 = {
  a = 1,
  b = 'b',
  c = {},
  d = function() end,
  [',;'] = 123
}
-- 2.读取:对于符合命名规范的 key,可以直接通过.语法读取
table2.def -- nil(不存在取值为 nil)
table2.a -- 1
table2.b -- 'b'
table2['c'] -- table: 0x154
table2['d'] -- function: 0x155
table2[',;'] -- 123
-- 3.赋值
table2[',;'] = 'test'

函数类型 Function

与 JavaScript 中的函数类似,Lua 中的函数也是一等公民,可以赋值给变量、作为参数传递、作为返回值返回等。

-- 一.语法:通过 function + end 表示代码块
function 函数名(参数名1, 参数名2...)
  return 返回值1, 返回值2...
end

-- 二.声明
-- 1.无返回值:lua 中函数入参如果不传默认 nil,返回值默认 nil,可以返回多个值
function f1(a, b)
  local c = a + b
end
-- 2.单个返回值
local f2 = function (a, b, c)
  return a + c
end
-- 3.多个返回值
function f3(a, b)
  return a + b, a - b
end

-- 三.调用
f1(1, 20) -- nil
f2(1, nil, 3) -- 4
local i, j = f3(1, 2) -- 3, -1

线程类型 Thread

Lua 中的线程本质是由协程(coroutine)实现的,协程允许多个任务交替执行,但不同于线程是协程是由 Lua 运行时环境调度而非操作系统调度。

-- 1.创建协程
local co = coroutine.create(function (a, b)
  print(a + b)
end)
-- 2.启动协程
coroutine.resume(co, 1, 2) -- 3
-- 3.暂停协程
coroutine.yield() -- 挂起当前协程,继续执行其他协程
-- 4.协程状态
coroutine.status(co) -- 'suspended'-挂起
coroutine.running() -- nil(当前没有协程在运行)

4.运算符

算数运算符

-- 1.数学计算
+  -  *  / % ^

比较运算符

-- 1.大小比较
>  <  >=  <=

-- 2.相等比较
==  ~=

逻辑运算符

-- 1.或、且、非
or  and  not

-- 2.短路运算
a or b -- a 为真返回 a、a 为假返回 b
a and b -- a 为真返回 b、a 为假返回 a
a and 'yes' or 'no' -- a 为真返回 'yes'、a 为假返回 'no'

位运算符

-- 1.左移、右移
<<  >>

5.控制语句

if-else 判断

-- 通过 then + end 表示代码块
if 1 > 10 then
    print('1')
elseif 1 < 10 then
    print('2')
else
    print('3')
end

for 循环

-- 1.默认步长 1:lua for 循环局部变量 i 不可修改,如果修改系统会重新声明一个 i
for i = 1, 10 do
    print(i) -- 1 2 3 4 5 6 7 8 9 10
end

-- 2.指定步长
for i = 1, 10, 2 do
    print(i) -- 1 3 5 7
    if i >=7 then
        break -- break(终止当前层级循环)
    end
end

while 循环

local i = 10
while i > 1 do
    print(i) -- 10 9 8 7 6
    i = i - 1 -- lua 不支持自增自减运算符
    if i <= 5 then
        break -- break(终止当前层级循环)
    end
end