Skip to main content

rust

当进行Rust系统编程时,分析内存管理,优化并发性能,解决安全问题。验证系统架构,设计高性能应用,和最佳实践。

Datos de origen

Repositorio
microwind/ai-skills
Última actividad en el origen
29 de marzo de 2026 a las 02:54
Idioma detectado de SKILL.md
chino
Estrellas
83
Forks
24

Opciones de instalación

De forma predeterminada está seleccionado el prompt que primero revisa el origen. Puedes cambiar a un comando directo o descargar una copia local.

Revisa los archivos de origen

Lee SKILL.md y los archivos complementarios que muestra SkillsMP antes de decidir si quieres instalarlo.

Explorador de archivos
4 archivos

Mostrando SKILL.md

SKILL.md
Instrucciones de origen · Vista previa de solo lectura
name
Rust系统编程
description
当进行Rust系统编程时,分析内存管理,优化并发性能,解决安全问题。验证系统架构,设计高性能应用,和最佳实践。
license
MIT
# Rust系统编程技能 ## 概述 Rust是一门系统编程语言,以其内存安全、并发安全和高性能而著称。Rust通过所有权系统、借用检查器和生命周期机制,在编译时就能防止许多常见的编程错误。不当的Rust编程会导致编译错误、性能问题、代码复杂。 **核心原则**: 好的Rust代码应该内存安全、并发安全、性能优良、可读性强。坏的Rust代码会滥用unsafe、性能损耗、难以维护。 ## 何时使用 **始终:** - 开发系统级软件时 - 需要高性能计算时 - 处理并发编程时 - 构建网络服务时 - 开发嵌入式系统时 - 需要内存安全保证时 **触发短语:** - "Rust所有权系统怎么理解?" - "Rust并发编程最佳实践" - "如何避免Rust编译错误?" - "Rust性能优化技巧" - "Rust异步编程模式" - "Rust系统编程应用" ## Rust系统编程技能功能 ### 内存管理 - 所有权系统 - 借用和引用 - 生命周期管理 - 智能指针 - 内存布局优化 ### 并发编程 - 线程和同步 - 通道通信 - 异步编程 - 原子操作 - 无锁数据结构 ### 系统编程 - 文件系统操作 - 网络编程 - 进程间通信 - 系统调用封装 - 底层硬件交互 ### 错误处理 - Result和Option类型 - 错误传播机制 - 自定义错误类型 - 错误恢复策略 - 异常安全保证 ## 常见问题 ### 编译错误 - **问题**: 借用检查器错误 - **原因**: 不理解Rust的借用规则 - **解决**: 学习所有权和借用机制,使用引用和克隆 - **问题**: 生命周期错误 - **原因**: 生命周期标注不正确 - **解决**: 理解生命周期规则,使用生命周期标注 ### 性能问题 - **问题**: 过度克隆导致性能下降 - **原因**: 不理解所有权转移 - **解决**: 合理使用引用,避免不必要的克隆 - **问题**: 频繁的内存分配 - **原因**: 不了解Rust的内存管理 - **解决**: 使用栈分配、对象池等技术 ### 并发问题 - **问题**: 数据竞争 - **原因**: 不正确的共享数据访问 - **解决**: 使用Rust的并发安全机制 - **问题**: 死锁 - **原因**: 锁的获取顺序不当 - **解决**: 遵循一致的锁获取顺序 ## 代码示例 ### 所有权和借用 ```rust // 基础所有权概念 fn ownership_basics() { // 字符串所有权转移 let s1 = String::from("Hello"); let s2 = s1; // 所有权从 s1 转移到 s2 // println!("{}", s1); // 编译错误:s1 不再拥有字符串 println!("{}", s2); // 正确:s2 拥有字符串 // 克隆避免所有权转移 let s3 = String::from("World"); let s4 = s3.clone(); // 克隆数据,s3 仍然有效 println!("{}, {}", s3, s4); // 正确:两个都有效 // 函数参数的所有权转移 let s5 = String::from("Rust"); takes_ownership(s5); // s5 的所有权转移到函数 // println!("{}", s5); // 编译错误:s5 不再有效 let s6 = String::from("Programming"); let len = calculate_length(&s6); // 借用,不转移所有权 println!("'{}' 的长度是 {}", s6, len); // s6 仍然有效 } fn takes_ownership(some_string: String) { println!("{}", some_string); } fn calculate_length(s: &String) -> usize { s.len() } // 可变借用 fn mutable_borrowing() { let mut s = String::from("Hello"); // 不可变借用 let r1 = &s; let r2 = &s; println!("r1: {}, r2: {}", r1, r2); // 可变借用(在不可变借用作用域结束后) let r3 = &mut s; r3.push_str(", World!"); println!("r3: {}", r3); // 悬垂引用示例(编译错误) // let reference_to_nothing = dangle(); } // fn dangle() -> &String { // 编译错误 // let s = String::from("Hello"); // &s // s 将在函数结束时被销毁 // } // 切片类型 fn slice_types() { let s = String::from("Hello World"); // 字符串切片 let hello = &s[0..5]; let world = &s[6..11]; println!("{} {}", hello, world); // 数组切片 let a = [1, 2, 3, 4, 5]; let slice = &a[1..4]; println!("数组切片: {:?}", slice); // 函数参数使用切片 let word = first_word(&s); println!("第一个单词: {}", word); } fn first_word(s: &str) -> &str { let bytes = s.as_bytes(); for (i, &item) in bytes.iter().enumerate() { if item == b' ' { return &s[0..i]; } } &s[..] } ``` ### 结构体和枚举 ```rust // 结构体定义 #[derive(Debug, Clone, Copy)] struct Point { x: f64, y: f64, } #[derive(Debug)] struct Rectangle { width: u32, height: u32, top_left: Point, } impl Rectangle { // 关联函数(静态方法) fn new(width: u32, height: u32) -> Self { Rectangle { width, height, top_left: Point { x: 0.0, y: 0.0 }, } } // 方法 fn area(&self) -> u32 { self.width * self.height } // 可变方法 fn resize(&mut self, new_width: u32, new_height: u32) { self.width = new_width; self.height = new_height; } // 获取所有权的方法 fn move_to(self, new_x: f64, new_y: f64) -> Self { Rectangle { width: self.width, height: self.height, top_left: Point { x: new_x, y: new_y }, } } } // 枚举定义 #[derive(Debug)] enum IpAddr { V4(u8, u8, u8, u8), V6(String), } #[derive(Debug)] enum Message { Quit, Move { x: i32, y: i32 }, Write(String), ChangeColor(i32, i32, i32), } impl Message { fn process(&self) { match self { Message::Quit => println!("退出程序"), Message::Move { x, y } => println!("移动到坐标 ({}, {})", x, y), Message::Write(text) => println!("写入文本: {}", text), Message::ChangeColor(r, g, b) => println!("改变颜色为 RGB({}, {}, {})", r, g, b), } } } // Option 和 Result 类型 fn option_examples() { let numbers = vec![1, 2, 3, 4, 5]; // 使用 Option let first_even = numbers.iter().find(|&&x| x % 2 == 0); match first_even { Some(num) => println!("第一个偶数: {}", num), None => println!("没有找到偶数"), } // 使用 Option 的方法 let doubled = first_even.map(|x| x * 2); println!("偶数的两倍: {:?}", doubled); // 使用 unwrap_or 提供默认值 let value = doubled.unwrap_or(0); println!("值: {}", value); } fn result_examples() -> Result<i32, String> { let x = 10; let y = 0; if y == 0 { Err("除数不能为零".to_string()) } else { Ok(x / y) } } fn handle_result() { match result_examples() { Ok(result) => println!("结果: {}", result), Err(error) => println!("错误: {}", error), } // 使用 ? 操作符 let result = divide_numbers(10, 2); println!("除法结果: {}", result); let result = divide_numbers(10, 0); println!("除法结果: {}", result); } fn divide_numbers(x: i32, y: i32) -> Result<i32, String> { if y == 0 { Err("除数不能为零".to_string()) } else { Ok(x / y) } } ``` ### 错误处理 ```rust use std::fs; use std::io::{self, Read}; // 自定义错误类型 #[derive(Debug)] enum AppError { Io(io::Error), ParseError(std::num::ParseIntError), Custom(String), } impl std::fmt::Display for AppError { fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { match self { AppError::Io(err) => write!(f, "IO错误: {}", err), AppError::ParseError(err) => write!(f, "解析错误: {}", err), AppError::Custom(msg) => write!(f, "自定义错误: {}", msg), } } } impl std::error::Error for AppError {} // From trait 实现 impl From<io::Error> for AppError { fn from(err: io::Error) -> Self { AppError::Io(err) } } impl From<std::num::ParseIntError> for AppError { fn from(err: std::num::ParseIntError) -> Self { AppError::ParseError(err) } } // 错误处理函数 fn read_file_contents(path: &str) -> Result<String, AppError> { let mut content = String::new(); let mut file = fs::File::open(path)?; file.read_to_string(&mut content)?; Ok(content) } fn parse_numbers(content: &str) -> Result<Vec<i32>, AppError> { content .lines() .map(|line| line.trim().parse::<i32>()) .collect() } fn calculate_sum(path: &str) -> Result<i32, AppError> { let content = read_file_contents(path)?; let numbers = parse_numbers(&content)?; Ok(numbers.iter().sum()) } // 错误恢复策略 fn safe_divide(x: f64, y: f64) -> Option<f64> { if y == 0.0 { None } else { Some(x / y) } } fn robust_calculation() { let operations = vec![ (10.0, 2.0), (5.0, 0.0), (8.0, 4.0), ]; for (x, y) in operations { match safe_divide(x, y) { Some(result) => println!("{}/{} = {}", x, y, result), None => println!("{}/{} 无法计算(除数为零)", x, y), } } } // 错误链 use std::error; use std::fmt; #[derive(Debug)] struct DatabaseError { message: String, source: Option<Box<dyn error::Error + Send + Sync>>, } impl fmt::Display for DatabaseError { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { write!(f, "数据库错误: {}", self.message) } } impl error::Error for DatabaseError { fn source(&self) -> Option<&(dyn error::Error + 'static)> { self.source.as_ref().map(|e| e.as_ref()) } } fn database_operation() -> Result<(), DatabaseError> { // 模拟数据库操作 Err(DatabaseError { message: "连接失败".to_string(),
Ver en GitHub
Este SKILL.md es muy grande, por eso SkillsMP muestra aqui solo la primera seccion. Ver en GitHub