一、基础知识:
- 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(增强版)
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 adds `default` constructor.
let mut p2 = p1.clone(); // Clone trait adds `clone` 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:?}");
}
- 养成单元测试的习惯