Rust 速成:开发 Tauri 够用的语法

本篇是给前端开发者的 Rust 速成课,目标不是精通语言,而是覆盖写 Tauri 命令时 90% 会用到的语法:变量与类型、所有权与借用、结构体与枚举、错误处理、特征与泛型入门。学完这些,大部分业务命令都能独立写出来,遇到看不懂的代码也知道查哪里。

一、变量与类型

Rust 用 let 声明变量,默认不可变;需要修改加 mut。类型分整型、浮点、布尔、字符与字符串:

let count: i32 = 10;          // 不可变
let mut total = 0;            // 可变,类型推断为 i32
let name: String = String::from("Tauri");
let slice: &str = "hello";    // 字符串切片,不持有所有权
let flag = true;
Rust 类型 JS 对应 备注
i32 / i64 number 区分整数与浮点
f64 number 默认浮点
bool boolean
String string 拥有所有权
&str string 借用视图
Vec<T> Array
HashMap<K,V> Object

字符串是初学者最容易绕晕的部分。简单记:String 是堆上完整字符串,&str 是对某段字符串的引用视图。命令参数用 &str 最省,返回字符串用 String。

二、所有权与借用

Rust 没有垃圾回收,靠所有权规则在编译期管理内存。三条核心规则:每个值有唯一所有者;赋值或传参会转移所有权;借用以引用形式使用值而不获取所有权。

fn greet(name: &str) -> String {   // name 借用
    format!("你好 {}", name)        // 返回新 String
}

fn main() {
    let s = String::from("世界");
    let msg = greet(&s);            // 传引用,s 仍可用
    println!("{}", s);
}

写 Tauri 命令时记住套路:参数尽量用引用,返回值创建新对象。所有权在 Tauri 状态共享中的影响见「全局状态:tauri::State 与共享数据」与「所有权与线程安全:Send、Sync 与 Mutex」。想系统学习推荐先读 Rust 入门 的所有权章节。

三、结构体与枚举

结构体定义数据形状,与 JS 的对象概念接近,但类型严格:

struct Task {
    title: String,
    done: bool,
}

impl Task {
    fn new(title: &str) -> Self {
        Task { title: title.to_string(), done: false }
    }
}

枚举比 JS 的字符串常量强大得多,可以携带数据,是 Rust 错误处理的基础:

enum Status {
    Idle,
    Running { progress: u32 },
    Failed(String),
}

fn describe(s: Status) -> String {
    match s {
        Status::Idle => "空闲".into(),
        Status::Running { progress } => format!("进行中 {}%", progress),
        Status::Failed(msg) => format!("失败:{}", msg),
    }
}

match 必须覆盖所有分支,编译器强制穷尽,这是 Rust 可靠性的来源之一。

四、错误处理:Result 与 Option

Rust 没有异常,错误是普通值。Result<T, E> 表示可能失败,Option<T> 表示可能为空:

fn parse_count(s: &str) -> Result<i32, String> {
    s.parse::<i32>().map_err(|_| format!("无法解析:{}", s))
}

fn first(list: &[i32]) -> Option<i32> {
    list.first().copied()
}

? 运算符在函数内提前传播错误,写起来最顺手:

fn read_len(path: &str) -> Result<u64, String> {
    let meta = std::fs::metadata(path).map_err(|e| e.to_string())?;
    Ok(meta.len())
}

Tauri 命令返回 Result 时错误会传给前端,完整规范见「错误处理与前端可读的序列化」。

五、特征、泛型与 Serde 入门

特征类似接口,定义一组方法签名。Tauri 命令收到参数必须实现 Deserialize,返回值与事件载荷必须实现 Serialize,都来自 serde。派生宏一键实现:

use serde::{Deserialize, Serialize};

#[derive(Debug, Serialize, Deserialize)]
struct Config {
    theme: String,
    font_size: u32,
}

日常开发用到派生宏就够了,很少需要手写 serde 实现。泛型在写通用工具函数时会遇到,会读即可。生命周期标注在简单命令里基本用不到,看到 'a 不必紧张,以编译器提示为准。

写 Tauri 命令需要的语法地图就这些。配对练习很有效:每写一个命令,对照本篇查缺补漏。想快速生成 Rust 命令骨架,可以参考 Claude Code 指南 的 AI 辅助方式;想在日志与代码中批量查找模式,正则 mastery 值得一读;异步与并发内容较多,单独成篇见「异步命令与后台任务」。

六、常用标准库速查

写 Tauri 命令最高频接触的标准库模块,先记住入口即可:

模块 用途
std::fs 文件读写
std::path::PathBuf 跨平台路径拼接
std::time::Duration 定时与休眠
std::collections::HashMap 键值容器
std::process::Command 启动外部程序

PathBuf 是重中之重:跨平台路径拼接永远不要手写分隔符,用 PathBuf::from(dir).join("file.json") 让 Rust 处理斜杠方向。字符串拼接用 format! 宏,它比 JS 的模板字符串更严格,类型不匹配直接编译报错。

学到这一步,你可以读懂大多数 Tauri 命令代码,遇到编译错误也能按提示顺藤摸瓜。剩下的进阶内容按需查阅:并发看「所有权与线程安全」,异步看「异步命令与后台任务」,序列化细节看「错误处理与前端可读的序列化」,配合 Rust 入门 的系统章节查缺补漏。

本篇刻意压扁了 Rust 的学习曲线:只讲 Tauri 开发最常踩的那部分。后续遇到不懂的语法随时回来按图索骥,配合 Rust 入门 的完整章节,一周内就能写出相当地道的命令代码。

学语法最快的路径永远是写一个小命令并跑通它。现在就动手:定义一个结构体,写一个返回它的命令,加一个错误分支,在前端调用并打印结果。这十分钟的练习胜过读一小时文档,后续章节也会因此更顺。

保持学习节奏的建议:每学一个语法点立即在命令里用一次。学完所有权就拿 State 试,学完枚举就写错误类型,学完特征就给序列化加自定义实现。语法与场景紧密绑定才记得牢,这是从做中学的节奏,也是最符合 Tauri 开发者偏好的学习路径。

延伸阅读

  • Rust 入门:本速成课的完整版
  • 错误处理与前端可读的序列化——Result 在 Tauri 命令中的规范写法
  • 异步命令与后台任务——语法进阶的第一站