安装方式
手动下载安装
下载 ZIP 后解压到技能目录即可安装。若在桌面客户端 WebView中直接下载出现异常,本站会改为提示页 + 原始链接,请按页内说明操作。
下载 ZIP (shub-rust-patterns-v1.0.0.zip)触发指令
/rust-patterns
跨平台安装指引
该技能声明兼容以下 1 个平台,将 ZIP 解压到对应目录即可被识别。
unzip shub-rust-patterns-v1.0.0.zip -d ~/.claude/skills/
mkdir -p 创建;启用 Skill 后请重启对应 Agent 让配置生效。
使用指南
Rust 常用模式
围绕 Rust 常用模式:所有权、错误类型、测试与模块组织;与 cargo 工作区见 SKILL.md。 无需在每次任务前把零散英文说明手工拼进上下文,也 减少 与客户端默认行为脱节的试错;具体命令、钩子与 JSON 参数仍以 ZIP 包内 SKILL.md 为权威。下文结构与站内 MCP CLI 类专题稿相同:何时用、前置、流程、速查与故障。
何时使用
- 所有权、错误类型、测试与模块组织
- 与 cargo 工作区见 SKILL.md
- 已获取本技能 ZIP,并准备在 Claude Code / OpenClaw 中按 SKILL.md 挂载。
- 希望用中文专题稿快速判断「该不该启用」,再深入英文 SKILL 查参数与边界。
- 需要与团队对齐同一套触发方式、目录约定或回调格式时。
前置条件
- 通用:可运行 Claude Code 或文档要求的客户端;有可读写的项目工作区(或 SKILL.md 指定的沙箱目录)。
- 权威细节:API Key / OAuth、钩子路径、环境变量以 ZIP 内 SKILL.md 为准。
典型流程
- 从 ClawHub / 站内分发获取技能 ZIP,校验版本与校验和(若提供)。
- 阅读 SKILL.md 的安装段落:目录落点、客户端类型(Claude Code / OpenClaw / 脚本)。
- 用文档中的最小示例完成第一次调用(单文件修改、单次查询或单次委派)。
- 确认工作目录、权限边界与输出路径后,再处理多文件或长耗时任务。
- 需要回调 / Webhook / 通知时,按 SKILL.md 配置端点并在测试环境先验通。
与 ZIP / SKILL.md 的关系
站内专题稿与 MCP CLI 类 oss 稿同样:概括何时用、怎么接、怎么排错;命令模板、钩子名、JSON 字段、版本矩阵一律以 ZIP 内 SKILL.md 与 ClawHub 上游为准。
命令示例(摘自包内 SKILL.md)
以下为从上游 SKILL.md(或入库正文)自动抽取的终端/脚本片段;路径、环境变量与参数以当前 ZIP 与官方说明为准。
ClawHub slug:rust-patterns(安装命令以 SKILL.md / claw CLI 为准)。
站内入库时的触发命令(完整语义见 ZIP):
# 使用本技能时可在对话中引用或执行上述指令;完整参数与示例见下载包内 SKILL.md。
/rust-patterns
最佳实践
- 先 SKILL.md 再猜参数;站内专题稿不替代 schema 与必填字段说明。
- 委派任务时写清验收标准(命令、文件路径、测试命令),减少来回追问。
- 长任务用文档推荐的回调 / 日志落盘代替高频轮询,省 Token 也省机器负载。
- 多技能同时启用时,注意钩子加载顺序与重复工具调用(以 SKILL.md 冲突说明为准)。
调试与排错
- 打开 stderr 与客户端日志;PTY/tmux 场景同时看面板最后几十行输出。
- 参数错误时对照 SKILL.md 中的 JSON/CLI 示例(引号、转义、工作目录)。
- 网络类失败:查代理、防火墙、MCP 传输方式(stdio / HTTP / SSE)。
速查
| 动作 | 说明 |
|------|------|
| 获取技能包 | ClawHub / 站内 ZIP,核对版本 |
| 权威步骤 | 优先阅读 ZIP 内 SKILL.md |
| 首次试跑 | 使用 SKILL.md 最小示例 |
| 验收 | 对照路径、测试命令或回调负载 |
常见故障
- 无输出或立即退出 → 工作目录错误、依赖未装、或 Claude Code 未登录;按 SKILL.md 自检清单执行。
- 权限被拒绝 → 检查沙箱路径、
--permission-mode与工具白名单。 - 与简介不符 → 以英文 SKILL 与上游仓库为准,站内稿仅作结构化导读。
# Rust Systems Programming Patterns
## Description
A comprehensive guide to production Rust patterns for 2026. Covers ownership and borrowing mental models, error handling with thiserror/anyhow, async concurrency with Tokio, web services with Axum, database access (SQLx, Diesel, SeaORM), CLI development, WebAssembly, and Python bindings via PyO3. Targets Rust Edition 2024 (1.85.0+).
## Usage
Install this skill to get production-ready Rust patterns including:
- Ownership, borrowing, and lifetime rules with concrete mental models
- thiserror vs anyhow selection guide for libraries vs applications
- Tokio runtime patterns: spawn, select!, streams
- Axum web server: routing, extractors, middleware, shared state
- Concurrency primitives: Arc, Mutex, RwLock, channels, Rayon
When working on Rust projects, this skill provides context for:
- Deciding when to clone vs borrow vs move
- Structuring async code to avoid blocking the event loop
- Choosing between database libraries based on project needs
- Building CLI tools with Clap v4 derive API
- Creating Python extension modules with PyO3
## Key Patterns
### Ownership Mental Model
Think of ownership like a title deed:
- Move (`let y = x`): You transfer the deed. `x` is no longer valid.
- Immutable borrow (`&T`): Multiple readers simultaneously, no modifications.
- Mutable borrow (`&mut T`): One exclusive borrower who can modify. No others inside.
```rust
// Quick pattern reference
fn risky() -> Result<T, E> {
let x = operation()?; // ? operator: early return on error
Ok(x)
}
// Shared mutable state across threads
let data = Arc::new(Mutex::new(vec![]));
let clone = Arc::clone(&data);
tokio::spawn(async move { clone.lock().unwrap().push(1); });
```
### Error Handling: thiserror vs anyhow
Use `thiserror` for libraries (callers need matchable error variants):
```rust
use thiserror::Error;
#[derive(Error, Debug)]
pub enum MyError {
#[error("file not found: {0}")]
FileNotFound(String),
#[error("io error: {0}")]
IoError(#[from] io::Error), // auto-converts from io::Error
}
```
Use `anyhow` for applications (add context to error chains):
```rust
use anyhow::{Result, Context};
fn main() -> Result<()> {
let data = std::fs::read_to_string("user.json")
.context("could not read user.json")?;
Ok(())
}
```
### Tokio Async Patterns
```rust
// Multi-threaded runtime
#[tokio::main(flavor = "multi_thread", worker_threads = 4)]
async fn main() { ... }
// Race futures: select! picks the first to complete
let winner = tokio::select! {
result = slow_future() => result,
result = fast_future() => result,
_ = tokio::time::sleep(Duration::from_secs(5)) => "timeout",
};
// Blocking code inside async: use spawn_blocking
let data = tokio::task::spawn_blocking(|| {
std::fs::read_to_string("file.txt")
}).await.unwrap();
```
Anti-pattern: blocking sync I/O inside `async fn`. Use `tokio::fs` instead of `std::fs`.
### Axum Web Server
```rust
use axum::{Router, routing::{get, post}, Json, http::StatusCode};
use std::sync::Arc;
#[derive(Clone)]
struct AppState { db_url: String }
async fn create_user(Json(user): Json<User>) -> (StatusCode, Json<User>) {
(StatusCode::CREATED, Json(user))
}
#[tokio::main]
async fn main() {
let state = Arc::new(AppState { db_url: "postgres://...".into() });
let app = Router::new()
.route("/users", post(create_user))
.with_state(state);
let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap();
axum::serve(listener, app).await.unwrap();
}
```
### Concurrency Primitives
```rust
// Arc<Mutex<T>>: shared mutable state across threads
let counter = Arc::new(Mutex::new(0));
for _ in 0..10 {
let c = Arc::clone(&counter);
thread::spawn(move || { *c.lock().unwrap() += 1; });
}
// RwLock: multiple readers OR one writer
let data = Arc::new(RwLock::new(vec!["a", "b"]));
let read = data.read().unwrap(); // shared read
let write = data.write().unwrap(); // exclusive write
// Rayon: parallel iterators (automatic work-stealing)
use rayon::prelude::*;
let sum: u64 = (1..=1_000_000).collect::<Vec<_>>().par_iter().sum();
```
Prefer channels over Arc<Mutex> for message-passing patterns.
### SQLx: Compile-Time Checked SQL
```rust
use sqlx::PgPool;
let pool = PgPool::connect("postgres://user:pass@localhost/db").await?;
let users: Vec<(i32, String)> = sqlx::query_as(
"SELECT id, name FROM users WHERE age > $1"
).bind(18).fetch_all(&pool).await?;
```
Database selection: `sqlx` for raw SQL with compile-time checks, `diesel` for type-safe query builder (sync), `sea-orm` for full async ORM.
### Clap v4 CLI (Derive API)
```rust
use clap::{Parser, Subcommand};
#[derive(Parser)]
#[command(name = "myapp", about = "My CLI tool")]
struct Cli {
#[arg(short, long)] verbose: bool,
#[command(subcommand)] command: Commands,
}
#[derive(Subcommand)]
enum Commands {
Process { #[arg(short, long)] format: String },
Download { url: String },
}
```
### PyO3: Python Bindings
```rust
use pyo3::prelude::*;
#[pymodule]
fn mymodule(py: Python, m: &PyModule) -> PyResult<()> {
m.add_function(wrap_pyfunction!(fast_compute, m)?)?;
Ok(())
}
#[pyfunction]
fn fast_compute(data: Vec<f64>) -> f64 {
data.iter().sum()
}
// Build with: maturin develop --release
// Use from Python: import mymodule; result = mymodule.fast_compute([1.0, 2.0])
```
### Rust 2024 Edition
```rust
// Async traits work natively (no async_trait crate needed)
pub trait Fetcher {
async fn fetch(&self, url: &str) -> Result<String>;
}
// Let chains: cleaner nested conditions
if let Some(x) = get_value()
&& x > 0
&& let y = x * 2
&& y < 100
{
println!("All conditions met: {}", y);
}
```
### Anti-Patterns to Avoid
| Anti-Pattern | Better Approach |
|---|---|
| Over-cloning to bypass borrow checker | Use references &T instead |
| Arc<Mutex<T>> everywhere | Single owner + mutable ref, or channels |
| .unwrap() in library code | Return Result<T, E> |
| Sync I/O in async functions | Use tokio::fs, spawn_blocking |
## Tools & References
- [The Rust Book](https://doc.rust-lang.org/book/)
- [Tokio Tutorial](https://tokio.rs/tokio/tutorial)
- [Axum Docs](https://docs.rs/axum/latest/axum/)
- [PyO3 Docs](https://pyo3.rs/)
- `cargo add tokio --features full` - async runtime
- `cargo add axum serde serde_json` - web + serialization
- `cargo add thiserror anyhow` - error handling
---
*Published by [MidOS](https://midos.dev) — MCP Community Library*