一、基础知识:
-
todo!:这个宏用来标记未实现功能。
-
可以不写retuen的写法(if/else不能写
分号
,break带分号,loop写不写看情况):fn fib(n: u32) -> u32 {
if n <= 2 {
// The base case.
1
} else {
// The recursive case.
fib(n-2) + fib(n-1)
}
}
let size = if x < 20 { "small" } else { "large" }; -
loop简单理解为没有while条件的do循环
-
常用宏:
println!(format, ...) prints a line to standard output, applying formatting described in std::fmt.
format!(format, ...) 的用法与 println! 类似,但它以字符串形式返回结果。
dbg!(expression) 会记录表达式的值并返回该值。
todo!() 用于标记尚未实现的代码段。如果执行该代码段,则会触发 panic。
unreachable!() 用于标记无法访问的代码段。如果执行该代码段,则会触发 panic -
数组声明方式:let mut a: [i8; 10] = [42; 10];
-
模式匹配match示例类似于switch(增强版)
fn
let input = 'x';
match input {
'q' => println!("Quitting"),
'a' | 's' | 'w' | 'd' => println!("Moving around"),
'0'..='9' => println!("Number input"),
key if key.is_lowercase() => println!("Lowercase: {key}"),
_ => println!("Something else"),
}
}
-
独占引用与共享引用:理解为写锁与读锁
-
if let
:单条的模式匹配 -
在rust中
;
语句的值是!
类型可以兼容一切类型 -
Debug、Clone、Default默认trait使用
#[derive(Debug, Clone, Default)]
struct Player {
name: String,
strength: u8,
hit_points: u8,
}fn main() {
let p1 = Player::default(); // Default trait addsdefault
constructor.
let mut p2 = p1.clone(); // Clone trait addsclone
method.
p2.name = String::from("EldurScrollz");
// Debug trait adds support for printing with{:?}
.
println!("{:?} vs. {:?}", p1, p2);
} -
drop是固定的析构函数,Box是智能指针
-
collect返回任意集合类型,不只是vector,要么在collect处设置类型,要么在接收collect返回的地方指定类型(模板),必须搭配迭代器使用:
fn main() {
let primes = vec![2, 3, 5, 7];
let prime_squares = primes.into_iter().map(|p| p * p).collect::<Vec<_>>();
println!("prime_squares: {prime_squares:?}");
} -
养成单元测试的习惯