赞
踩
rustup
rustc
cargo
cargo cmd
cargo run
cargo build --release
cargo 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>
表示在泛型类型参数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 let
let else expressions
return、break 或 panic
let else
fn hex_or_die_trying(maybe_string: Option<String>) -> Result<u32, String> {
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 assert
Error
e @ Err(_)
vs Err(e)
std lib
core
嵌入式常用,大部分不依赖 libc 或 操作系统上的分配器alloc
全局堆分配器 Vec,Box,Arcstd
PartialEq and Eq
(eq 自反性)PartialOrd and Ord
partial_cmp
std::ops
Add…From
和 Into
类型转换
From
后,系统会自动实现 Into
as
显式强制类型转换Read
和 Write
对 u8 来源进行抽象化处理Default
为类型生成默认值
Default
Fn 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<dyn Pet>
程序分配内存
内存管理方法
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_mut
Rc
多引用计数允许只读访问,不支持内部可变性slice
collections
的视图 view
lifetimes
迭代器 (next方法决定迭代视图)
Iterator
迭代器操作
next map filter...
for
循环, collect
方法…IntoIterator
into_iter
IntoIterator::into_iter
获取 self
所有权FromIterator
collect
FromIterator
可通过 Iterator
构建一个集合implementations of FromIterator for Vec, HashMap, etc
crate
根目录
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
是指当前模块中的 foo
crate::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); }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。