初识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 中只有 nil 和 false 是"假",其他都是"真"(包括 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 教程(菜鸟教程) 中文入门首选

八、结语

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

相关推荐
乌暮34 分钟前
综合案例:宠物电商系统
java·开发语言·spring·mvc·restful·1024程序员节
大文说跨境35 分钟前
亚马逊多店铺的图片素材怎么批量去重:EXIF 与哈希的处理流程
开发语言·php
大风起兮云飞扬丶2 小时前
Java——枚举
java·开发语言
小灰灰搞电子2 小时前
Rust+Slint 实现高级动态消息提示框源码分享
开发语言·rust
Dev _2 小时前
Python解释器安装在系统级目录导致命令行用户‌没有权限‌向该目录写入文件
开发语言·python
qq_406981033 小时前
大白话rust系列08 当变量遮蔽遇上引用,探究变量遮蔽的本质
开发语言·后端·rust
喵了几个咪3 小时前
GoWind ShortPlay 拆解:不用模型的推荐闭环——埋点回流、三路召回与已看去重
开发语言·后端·微服务·golang·gowind
谙弆悕博士3 小时前
用 C 写了个 Windows 聊天室,踩了几个多线程和控制台的坑
c语言·开发语言·c++·windows·网络编程·聊天室
Canmag 兴隆磁性3 小时前
回复磁导率 μ_R:永磁体在动态磁路中的关键参数
开发语言·学习·r语言·永磁材料·充磁·磁导率
CRMEB系统商城3 小时前
鲜花零售的预售与积分营销
开发语言·人工智能·科技·小程序·零售