Lua 教程 - 第十二章:最佳实践与优化
第十二章:最佳实践与优化
写出“能运行”的代码只是第一步,写出“高效、易读、易维护”的代码才是我们的目标。在本章,我们将总结 Lua 编程中的一些最佳实践和性能优化技巧。
12.1 代码风格与规范
良好的代码风格有助于团队协作和后期维护。
1. 局部变量优先
始终使用 local 声明变量,除非你确实需要全局变量。
性能:局部变量的访问速度比全局变量快得多。
安全:避免污染全局命名空间,减少变量冲突。
GC:局部变量的作用域结束时,引用解除,有利于垃圾回收。
-- Bad
count = 0
function inc() count = count + 1 end
-- Good
local count = 0
local function inc() count = count + 1 end
2. 命名约定
变量/函数:小写字母开头,驼峰命名 (e.g., userName, calculateTotal) 或下划线分隔 (e.g., user_name, calculate_total)。保持一致即可。
常量:全大写,下划线分隔 (e.g., ...
Lua 教程 - 第十一章:Lua 实战项目
第十一章:Lua 实战项目
纸上得来终觉浅,绝知此事要躬行。学习了这么多理论知识,是时候通过一些实战项目来巩固我们的 Lua 技能了。
本章将通过三个难度递增的小项目,带领大家综合运用前面学到的知识:
命令行计算器:练习字符串解析和基本的数学运算。
文本统计工具:练习文件 I/O、字符串匹配和表的操作。
简单的配置文件解析器:练习表的结构化数据处理。
11.1 项目一:命令行计算器
功能描述
用户在命令行输入简单的四则运算表达式(如 10 + 20 * 3),程序计算并输出结果。为了简化,我们暂时只支持两个操作数和一个运算符。
代码实现
-- calculator.lua
function calculate(n1, op, n2)
if op == "+" then
return n1 + n2
elseif op == "-" then
return n1 - n2
elseif op == "*" then
return n1 * n2
elseif op == "/" th ...
Rust 最佳实践
概述
本教程总结了 Rust 编程的最佳实践,帮助你编写更安全、高效、可维护的 Rust 代码。
代码风格
命名规范
// 变量和函数使用蛇形命名法(snake_case)
let user_name = "Alice";
fn calculate_sum(a: i32, b: i32) -> i32 {
a + b
}
// 类型使用帕斯卡命名法(PascalCase)
struct UserAccount {
name: String,
age: u32,
}
enum Color {
Red,
Green,
Blue,
}
// 常量使用全大写蛇形命名法(SCREAMING_SNAKE_CASE)
const MAX_CONNECTIONS: usize = 100;
// 特质使用帕斯卡命名法
trait Drawable {
fn draw(&self);
}
代码格式化
# 使用 rustfmt 格式化代码
carg ...
Lua 教程 - 第十章:Lua 与 C 交互
第十章:Lua 与 C 交互
Lua 的设计目标之一就是作为一种嵌入式语言,方便地与 C/C++ 等宿主语言进行交互。Lua 提供了丰富的 C API,允许我们在 C 代码中操作 Lua 状态机、调用 Lua 函数、读写 Lua 变量,反之亦然。
本章将介绍 Lua C API 的基础知识,包括栈操作、调用 Lua 函数以及在 C 中编写可供 Lua 调用的函数。
10.1 Lua C API 基础:虚拟栈
Lua 与 C 之间的数据交换是通过一个抽象的栈(Stack)来进行的。
Lua 将数据压入栈中,C 从栈中取出数据。
C 将数据压入栈中,Lua 从栈中取出数据。
栈索引
栈中的每个元素都有一个索引。
正索引:从栈底开始,1 表示栈底第一个元素,2 表示第二个,依此类推。
负索引:从栈顶开始,-1 表示栈顶元素,-2 表示栈顶下面的那个,依此类推。
常用栈操作 API
lua_pushnil(L): 压入 nil。
lua_pushboolean(L, b): 压入布尔值。
lua_pushnumber(L, n): 压入数字。
l ...
Rust 项目实战
概述
本教程将通过一个完整的实战项目,综合运用前面学到的 Rust 知识。我们将构建一个简单的命令行工具——任务管理器(Todo 应用)。
项目规划
功能需求
添加任务
列出所有任务
标记任务完成
删除任务
将任务保存到文件
从文件加载任务
项目结构
todo_app/
├── Cargo.toml
├── src/
│ ├── main.rs
│ ├── task.rs
│ ├── storage.rs
│ └── cli.rs
└── tasks.json
创建项目
初始化项目
cargo new todo_app
cd todo_app
配置 Cargo.toml
[package]
name = "todo_app"
version = "0.1.0"
edition = "2021"
[dependencies]
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
clap = { ...
Lua 教程 - 第九章:标准库
第九章:标准库
Lua 为了保持轻量级,核心语言非常小。但它提供了一组实用的标准库,涵盖了常用的功能。这些库由 C 语言实现,效率极高。
前面几章我们已经介绍了 string, table, io, debug 库。本章将重点介绍 math (数学) 和 os (操作系统) 库。
9.1 数学库 (math)
math 库包含了常用的数学函数。
常用三角函数
math.sin(x), math.cos(x), math.tan(x): 参数 x 为弧度。
math.deg(x): 弧度转角度。
math.rad(x): 角度转弧度。
print(math.sin(math.pi / 2)) -- 1.0
print(math.deg(math.pi)) -- 180.0
取整与绝对值
math.floor(x): 向下取整。
math.ceil(x): 向上取整。
math.abs(x): 绝对值。
math.fmod(x, y): 取模(浮点数)。
print(math.floor(3.7)) -- 3
print(math.cei ...
Rust 并发编程详解
概述
并发编程是现代编程的重要组成部分。Rust 通过所有权和类型系统提供了无数据竞争的并发编程能力。Rust 的并发模型基于消息传递和共享状态。
线程
创建线程
use std::thread;
use std::time::Duration;
fn main() {
thread::spawn(|| {
for i in 1..10 {
println!("子线程 hi {}次", i);
thread::sleep(Duration::from_millis(1));
}
});
for i in 1..5 {
println!("主线程 hi {}次", i);
thread::sleep(Duration::from_millis(1));
}
}
等待线程完成
use std::thread;
...
Lua 教程 - 第八章:错误处理与调试
第八章:错误处理与调试
在编程过程中,错误是不可避免的。Lua 提供了几种处理错误和调试代码的机制,帮助我们编写更健壮的程序。
Lua 将错误主要分为两类:语法错误(Syntax Errors)和运行时错误(Runtime Errors)。本章主要讨论运行时错误的捕获与处理。
8.1 错误处理
error 函数
我们可以使用 error 函数显式地抛出一个错误,终止程序的执行。
print("Enter a number:")
local n = io.read("n")
if not n then
error("Invalid input! Not a number.")
end
assert 函数
assert(v [, message]) 检查第一个参数 v 是否为真(非 false 且非 nil)。如果是真,返回 v;如果是假,抛出一个错误,错误信息为 message(默认为 “assertion failed!”)。
local n = assert(io.read("n"), "invalid input")
相当于:
local n = io.read(" ...

