跳到正文
灵动桌面框架
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()))?;

类型对照表

RustTypeScript
String / &strstring
i32 / i64 / u16number
boolboolean
Vec<T>T[]
Option<T>T | null
HashMap<String, T>Record<string, T>
()void

常用 Crate

Crate用途
tauriTauri 2 核心(启用 tray-icon 特性)
serde / serde_json序列化/反序列化
rusqliteSQLite 数据库(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 官方插件