跳到正文
灵动桌面框架
Esc
本栏目菜单

Rust 基础

本页面介绍在灵动桌面框架开发中最常用的 Rust 概念,示例均取自框架源码。

所有权与借用

Rust 最核心的特性,编译期保证内存安全:

// 借用(引用)— 不转移所有权
pub fn greet(name: &str) -> Result<String, CommandError> {
    Ok(format!("Hello, {}! 来自 Rust 的问候!", name))
}

Result 错误处理

框架中所有可能失败的操作都返回 Result,用 ? 向上传播错误(services/config.rs):

pub fn get(db: &Database, key: &str) -> Result<String, AppError> {
    db.get_config(key)?  // ? 自动传播数据库错误
        .ok_or_else(|| AppError::NotFound(format!("配置项 '{}' 不存在", key)))
}

Option 转 Result 用 ok_or_else,把“查不到”变成明确的业务错误。

结构体

use serde::{Deserialize, Serialize};

/// 应用配置(models/mod.rs)
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AppConfig {
    pub key: String,
    pub value: String,
}

字段名不会自动转驼峰

模型上没有 #[serde(rename_all = "camelCase")],序列化后的 JSON 字段名与 Rust 字段名一致(如 app_version)。前端类型的字段名必须与之对齐,或在 Rust 侧显式加 rename_all。

共享可变状态

Database 用 Mutex<Connection> 保证线程安全,加锁失败不 unwrap,而是转换成 AppError:

let conn = self.conn.lock().map_err(|e| AppError::Custom(e.to_string()))?;

类型对照表

Rust TypeScript
String / &str string
i32 / i64 / u16 number
bool boolean
Vec<T> T[]
Option<T> T | null
HashMap<String, T> Record<string, T>
() void

常用 Crate

Crate 用途
tauri Tauri 2 核心(启用 tray-icon 特性)
serde / serde_json 序列化/反序列化
rusqlite SQLite 数据库(0.31,bundled 特性内置 SQLite)
thiserror 错误类型定义(2.x)
log 日志门面,输出由 tauri-plugin-log 接管
chrono 日期时间(shared/time_utils.rs)
axum / tokio / tower-http 远程访问网关(remote/)的 HTTP 服务
tauri-plugin-* opener、store、log、updater、process、single-instance 官方插件