初识Lua

一、前言:你可能早已"用过" Lua!

虽然你没写过 Lua 代码,但很可能已经和它打过交道:

  • 🎮 《魔兽世界》插件:用 Lua 编写
  • 🌐 Nginx + OpenResty:用 Lua 处理高并发请求
  • 🔑 Redis 原子操作:通过 Lua 脚本实现

Lua 是一门极简、高效、可嵌入的脚本语言 ,设计哲学是:"小而美,快而稳"。

本文将带你10 分钟快速认识 Lua,无需任何前置知识!


二、Lua 是什么?为什么这么火?

2.1 基本信息

  • 诞生时间:1993 年(巴西里约热内卢天主教大学)
  • 名字含义:葡萄牙语 "月亮"(Moon)
  • 定位嵌入式脚本语言(不是独立应用开发语言)

2.2 核心特点

特性 说明
超轻量 解释器仅 200KB~300KB
高性能 JIT 编译(LuaJIT)速度接近 C
易嵌入 C API 极简,可轻松集成到任何系统
语法简洁 全语言只有 20 多个关键字

💡 一句话总结 :Lua 不是用来写大型系统的,而是给现有系统加"智能脚本"的胶水语言


三、第一个 Lua 程序:Hello World!

3.1 安装 Lua(可选)

  • Windows:下载 Lua for Windows
  • macOS:brew install lua
  • Linux:sudo apt install lua5.4

3.2 编写 hello.lua

Lua 复制代码
-- 这是我的第一个 Lua 程序!
print("Hello, Lua!")

3.3 运行

bash 复制代码
lua hello.lua
# 输出:Hello, Lua!

🎉 恭喜!你已经迈出了第一步!


四、Lua 语法速览(对比 Python)

4.1 变量与类型

Lua 是动态类型语言,变量无需声明:

bash 复制代码
name = "Alice"     -- 字符串
age = 25           -- 数字(整数和浮点统一)
is_ok = true       -- 布尔值
nothing = nil      -- 空值(相当于 Python 的 None)

⚠️ 注意 :Lua 中只有 nilfalse 是"假",其他都是"真"(包括 0 和空字符串)!

4.2 表(Table)------ Lua 的万能数据结构

Lua 没有数组、字典、对象 ,只有 table

bash 复制代码
-- 当作数组(注意:索引从 1 开始!)
fruits = {"apple", "banana", "orange"}
print(fruits[1])  --> apple

-- 当作字典(哈希表)
person = {name = "Bob", age = 30}
print(person.name)  --> Bob

-- 混合使用
data = {
    "first",
    name = "mixed",
    42
}

🔑 核心概念:table 是 Lua 唯一的复合数据类型,也是面向对象的基础。

4.3 控制结构

if 判断
bash 复制代码
if age >= 18 then
    print("成年人")
else
    print("未成年人")
end
for 循环
bash 复制代码
-- 数值循环(推荐)
for i = 1, 5 do
    print(i)  -- 输出 1,2,3,4,5
end

-- 遍历 table
for key, value in pairs(person) do
    print(key, value)
end

4.4 函数

bash 复制代码
function greet(name)
    return "Hello, " .. name .. "!"  -- .. 是字符串拼接
end

print(greet("World"))  --> Hello, World!

4.5 局部变量(重要!)

bash 复制代码
local x = 10  -- 局部变量(作用域仅当前 block)
y = 20        -- 全局变量(不推荐)

最佳实践 :始终用 local 声明变量,避免污染全局环境!


五、Lua 在 Redis 中的应用(重点!)

Redis 内置 Lua 引擎,用于执行原子性复杂操作

5.1 为什么需要 Lua?

  • 多条命令无法保证原子性(如:先查库存,再扣减)
  • 网络往返多次,性能差

5.2 基本用法:EVAL 命令

bash 复制代码
EVAL "return redis.call('GET', KEYS[1])" 1 mykey

5.3 脚本中的两个关键变量

  • KEYS:传入的 key 列表(从 1 开始索引
  • ARGV:传入的参数列表
Lua 复制代码
-- 示例:原子扣减库存
local stock = redis.call('GET', KEYS[1])
if tonumber(stock) >= tonumber(ARGV[1]) then
    redis.call('DECRBY', KEYS[1], ARGV[1])
    return 1
else
    return 0
end

优势 :整个脚本在 Redis 中原子执行,无并发问题!


六、Lua 的局限性

  • ❌ 不适合开发大型应用
  • ❌ 标准库较弱(需依赖宿主环境)
  • ❌ 在 Redis 中不能有随机行为(如 math.random() 需固定种子)

💡 记住 :Lua 是"嵌入式脚本",不是"通用编程语言"。


七、学习资源推荐

资源 说明
📚 《Programming in Lua》 官方权威教程(免费在线版)
🧪 Lua 在线运行 无需安装,直接练习
🐟 Lua 教程(菜鸟教程) 中文入门首选

八、结语

感谢您的阅读!如果你有任何疑问或想要分享的经验,请在评论区留言交流!

相关推荐
传奇开心果编程1 小时前
【Rust入门知识点学与练】第24课:Trait 基础
开发语言·学习·rust
言乐66 小时前
Python加速器4跨境网络加速器
运维·服务器·开发语言·网络·python
金金计较.7 小时前
Go语言-3
java·开发语言·golang
张小凡vip8 小时前
python--爬虫--经验积累的遇到的坑
开发语言·爬虫·python
Wang's Blog8 小时前
Java框架快速入门: Spring Security+OAuth2之云服务集成与多因子认证设计
java·开发语言·spring
门思科技8 小时前
LoRaWAN 网络容量估算:一个 SX1302 网关到底能带多少设备
开发语言·网络·php
大草原的小灰灰9 小时前
Python基础语法
开发语言·python
泡泡鱼(敲代码中)10 小时前
MySQL基础学习笔记:从数据模型到DDL全掌握
开发语言·数据库·笔记·学习·mysql
潜创微科技12 小时前
IT6520:USB-C 转 MIPI 高集成控制器,DP 1.4a 转 MIPI 单芯片搞定 4K120 显示
c语言·开发语言·低延迟·掌机·联阳
Escalating_xu12 小时前
【System V 信号量】从 P/V 原语到 Builder 封装:写出可控、可清理的进程互斥组件
java·linux·开发语言·jvm