Lua 快速入门教程

166 阅读6分钟

Lua 快速入门教程

本教程将带你从0到1掌握Lua编程语言的核心操作,通过知识点解析+代码示例的形式,让你轻松理解并应用Lua。

目录

  1. 环境准备与基础概念
  2. 变量与数据类型
  3. 控制结构
  4. 表(Table)
  5. 函数
  6. 模块系统
  7. 元表与元方法
  8. 文件操作
  9. 错误处理
  10. 实践案例

环境准备与基础概念

Lua简介

Lua是一种轻量级、高效的脚本语言,由巴西里约热内卢天主教大学的研究人员于1993年开发。它的设计目标是嵌入应用程序中,为应用程序提供灵活的扩展和定制功能。Lua具有以下特点:

  • 轻量级:Lua解释器的源代码非常精简,编译后只有几百KB
  • 可扩展性:易于与C/C++等语言集成
  • 高效:Lua的虚拟机实现非常高效
  • 灵活:动态类型、闭包、函数作为一等公民等特性

安装Lua

在Windows系统上,可以从Lua官网下载预编译的二进制文件,或者使用包管理器如Chocolatey安装。 或者下载编译好的文件 luabinaries.sourceforge.net/download.ht…

在Linux/Mac系统上,可以使用系统包管理器安装:

# Ubuntu/Debian
sudo apt-get install lua5.4

# CentOS/RHEL
sudo yum install lua

# macOS (使用Homebrew)
brew install lua

运行Lua程序

创建一个Lua文件(例如test.lua),然后使用lua命令运行:

lua test.lua

也可以直接在命令行中进入Lua交互模式:

lua

变量与数据类型

Lua是动态类型语言,变量不需要声明类型。Lua有8种基本数据类型:

  • nil:表示无效值
  • boolean:布尔值,true或false
  • number:数字(整数和浮点数统一表示)
  • string:字符串
  • table:表,Lua中唯一的数据结构
  • function:函数
  • userdata:用户数据
  • thread:线程

变量声明

在Lua中,变量声明不需要关键字,可以直接赋值:

-- 全局变量
x = 10
y = "Hello Lua"
z = true
n = nil

如果要声明局部变量,需要使用local关键字:

local x = 10
local y = "Hello Lua"

字符串操作

Lua的字符串可以使用单引号或双引号表示:

local str1 = 'Hello'
local str2 = "Lua"

字符串连接使用..操作符:

local str3 = str1 .. " " .. str2  -- 结果为 "Hello Lua"

字符串长度使用#操作符:

local len = #str3  -- 结果为 9

控制结构

条件语句

Lua的if语句结构如下:

if 条件1 then
    -- 代码块1
elseif 条件2 then
    -- 代码块2
else
    -- 代码块3
end

示例:

a = 10
if a > 5 then
    print("a > 5")
elseif a == 5 then
    print("a == 5")
else
    print("a < 5")
end

循环结构

while循环
while 条件 do
    -- 代码块
end

示例:

local a = 10
while a >= 5 do
    print(a)
    a = a - 1
end
print("final a=", a)
for循环

数值for循环:

for var = start, end, step do
    -- 代码块
end

示例:

for i = 1, 5 do
    print("i=", i)
end

-- 带步长的for循环
for i = 5, 1, -1 do
    print("i=", i)
end

泛型for循环(用于遍历表):

for key, value in pairs(table) do
    -- 代码块
end

示例:

for k, v in pairs({1, 2, 3, 4, 5}) do
    print("p=>", k, v)
end

表(Table)

表是Lua中唯一的数据结构,它既可以用作数组,也可以用作字典。

数组

-- 创建数组
local arr = {1, 2, 3}

-- 访问数组元素
for i = 1, #arr do
    print(arr[i])
end

字典

-- 创建字典
local dict = {
    name = "kimi",
    age = 23
}

-- 访问字典元素
print(dict.name)      -- 点语法
print(dict["age"])   -- 索引语法

表的常用操作

local t = {1, 2, 3, 4, 5}

-- 获取表长度
print(#t)  -- 输出 5

-- 添加元素
t[6] = 6

-- 删除元素
t[3] = nil

-- 遍历表
for i, v in ipairs(t) do  -- ipairs用于遍历数组部分
    print(i, v)
end

for k, v in pairs(t) do  -- pairs用于遍历所有键值对
    print(k, v)
end

函数

函数定义

function 函数名(参数列表)
    -- 函数体
    return 返回值
end

示例:

function add(a, b)
    return a + b
end

print(add(1, 23))  -- 输出 24

也可以使用匿名函数:

local add = function(a, b)
    return a + b
end

函数参数

Lua函数的参数是按值传递的,支持可变参数:

function sum(...)
    local args = {...}
    local result = 0
    for _, v in ipairs(args) do
        result = result + v
    end
    return result
end

print(sum(1, 2, 3, 4, 5))  -- 输出 15

闭包

Lua支持闭包,即函数可以访问其外部作用域的变量:

function createCounter()
    local count = 0
    return function()
        count = count + 1
        return count
    end
end

local counter = createCounter()
print(counter())  -- 输出 1
print(counter())  -- 输出 2
print(counter())  -- 输出 3

模块系统

Lua的模块是一个定义了函数和变量的表,可以通过require加载。

创建模块

创建一个名为module1.lua的文件:

-- module1.lua
function hello()
    print("hello from module1")
end

return {
    hello = hello
}

使用模块

在另一个Lua文件中使用该模块:

-- 加载模块
local module1 = require("module1")

-- 调用模块中的函数
module1.hello()

元表与元方法

元表(Metatable)是Lua中实现面向对象编程和运算符重载的关键机制。

设置元表

local t1 = {}
local t2 = {}
setmetatable(t1, t2)

元方法

元方法是元表中定义的特殊函数,用于处理特定操作:

local mt = {}

-- 加法元方法
mt.__add = function(a, b)
    return a.value + b.value
end

-- 设置元表
local t1 = {value = 10}
local t2 = {value = 20}
setmetatable(t1, mt)
setmetatable(t2, mt)

-- 使用重载的加法运算符
print(t1 + t2)  -- 输出 30

常用的元方法包括:

  • __add:加法
  • __sub:减法
  • __mul:乘法
  • __div:除法
  • __index:索引访问
  • __newindex:索引赋值
  • __tostring:字符串表示

文件操作

打开文件

-- 打开文件
local file = io.open("test.txt", "r")  -- r表示读取模式

文件模式包括:

  • r:只读
  • w:只写(创建新文件)
  • a:追加
  • r+:读写
  • w+:读写(创建新文件)
  • a+:读写(追加)

读写文件

-- 读取文件
local content = file:read("*a")  -- 读取全部内容

-- 写入文件
file:write("Hello Lua")

-- 关闭文件
file:close()

错误处理

断言

local function divide(a, b)
    assert(b ~= 0, "除数不能为零")
    return a / b
end

divide(10, 0)  -- 抛出错误:除数不能为零

异常捕获

local function safeDivide(a, b)
    local status, result = pcall(function()
        return a / b
    end)
    if status then
        return result
    else
        return nil, result
    end
end

local result, err = safeDivide(10, 0)
if not result then
    print("错误:", err)
end

实践案例

案例1:实现一个简单的计算器

-- calculator.lua
local calculator = {}

function calculator.add(a, b)
    return a + b
end

function calculator.subtract(a, b)
    return a - b
end

function calculator.multiply(a, b)
    return a * b
end

function calculator.divide(a, b)
    if b == 0 then
        error("除数不能为零")
    end
    return a / b
end

return calculator

案例2:实现一个简单的栈

-- stack.lua
local Stack = {}
Stack.__index = Stack

function Stack.new()
    local self = {}
    setmetatable(self, Stack)
    self.items = {}
    return self
end

function Stack:push(item)
    table.insert(self.items, item)
end

function Stack:pop()
    return table.remove(self.items)
end

function Stack:peek()
    return self.items[#self.items]
end

function Stack:size()
    return #self.items
end

function Stack:isEmpty()
    return #self.items == 0
end

return Stack

总结

本教程介绍了Lua编程语言的核心概念和基本语法,包括变量、数据类型、控制结构、表、函数、模块等。Lua是一种轻量级但功能强大的脚本语言,广泛应用于游戏开发、嵌入式系统、Web应用等领域。通过学习本教程,你已经掌握了Lua的基础知识,可以开始编写简单的Lua程序了。

要进一步学习Lua,建议查阅Lua官方文档,并通过实践项目来巩固所学知识。