rustup
rustccargocargo cmd
cargo runcargo build --releasecargo install 安装二进制命令cargo add .. 安装依赖cargo test 运行时 #[cfg(test)] 属性,条件编译生效conditional
continue/break 支持标签 'tag 跳出loop 唯一返回有意义值的循环结构,保证至少被输入一次for 语句支持对数组进行迭代(但不支持元组)
rust 中没有传统的 for (i = 0; i < 3; i++)(iterator)和 for 循环结构来进行循环操作type
array [T;N]tuple (T,) t.0 表示在泛型类型参数T没有明确指定类型的情况下,将使用类型 b 作为默认类型match
#[test]
fn test_match_usage() {
let input = 'x';
match input {
'q' => println!("Quitting..."),
'a' | 's' | 'w' | 'd' => println!("Movining..."),
'0'..='9' => println!("number input"),
key if key.is_lowercase() => println!("Lowercase: {key}"),
_ => println!("other..."),
}
}
let 控制流
if let 表达式while letlet else expressions
return、break 或 paniclet elsefn hex_or_die_trying(maybe_string: Option) -> Result {
let Some(s) = maybe_string else {
return Err(String::from("got None"));
};
let Some(first_byte_char) = s.chars().next() else {
return Err(String::from("got empty string"));
};
let Some(digit) = first_byte_char.to_digit(16) else {
return Err(String::from("not a hex digit"));
};
return Ok(digit);
}
references
Macros
assert_ne assert_eq assertError
e @ Err(_) vs Err(e)
std lib
core 嵌入式常用,大部分不依赖 libc 或 操作系统上的分配器alloc 全局堆分配器 Vec,Box,ArcstdPartialEq and Eq (eq 自反性)PartialOrd and Ord partial_cmpstd::ops Add…From 和 Into 类型转换
From 后,系统会自动实现 Intoas 显式强制类型转换Read 和 Write 对 u8 来源进行抽象化处理Default 为类型生成默认值
DefaultFn FnMut FnOnce
trait TraitA {
fn method_a(&self);
}
trait TraitB {
fn method_b(&self);
}
trait CombinedTrait: TraitA + TraitB {
fn combined_method(&self) {
self.method_a();
self.method_b();
}
}
Box程序分配内存
内存管理方法
c, c++,pascal...java,python,go..Rust通过编译时强制执行正确内存, 基于明确的所有权实现移动语义
Copy trait类型则会默认复制Copy VS Clone
std::mem::drop
references 借用检查
shared references 一个或多个共享引用,只读exclusive reference 独占引用,可读写内部可变性 Interior Mutability
持有共享引用又可以改变数据
Cell 非运行时借用检查, 使用&self移动语义 通过get/set支持内部可变RefCell 强制运行时借用检查 borrow/borrow_mutRc 多引用计数允许只读访问,不支持内部可变性slice
collections 的视图 viewlifetimes
迭代器 (next方法决定迭代视图)
Iterator 迭代器操作
next map filter...for 循环, collect 方法…IntoIterator into_iter
IntoIterator::into_iter 获取 self 所有权FromIterator collect
FromIterator 可通过 Iterator 构建一个集合implementations of FromIterator for Vec, HashMap, etccrate 根目录
src/lib.rs(对于库 crate, 入口文件)src/main.rs(对于二进制文件 crate) mod garden;
module/mod.rs rust2018 之前filename.rs 来替代filename/mod.rs src/
├── main.rs
├── top_module.rs
└── top_module/
└── sub_module.rs
Rust 寻找模块的位置可通过编译器指令更改 #[path = "some/path.rs"]
mod some_module;
pub(crate) 关键字来指定一个项(函数、结构体、枚举等)在当前 crate 中可见,但在其他 crate 中不可见。pub use 重新导出foo 或 self::foo 是指当前模块中的 foocrate::foo 是指当前 crate 的根中的 foo 绝对路径bar::foo 是指bar crate 中的foo,绝对路径在 Rust 中,空的代码块 {} 是一个表达式,它的值是 (),表示一个空的元组
test/ 目录支持集成测试
lint / Clippy 静态代码分析工具
fn main() {
println!("length: {}", collatz_length(11));
}
fn collatz_length(mut n: i32) -> u32 {
let mut len= 1;
while n > 1 {
n = if n % 2 == 0 { n / 2 } else { 3 * n + 1 };
len += 1;
}
len
}
#[test]
fn test_collatz_length() {
assert_eq!(collatz_length(11),15);
}