本文最后更新于 117 天前,其中的信息可能已经有所发展或是发生改变。
斐波那契数列练习 Rust day 1
涉及知识
- 变量绑定
- 元组解构
- 可变性
最终成果
fn sum_f(n: u32) -> u64 {
//创建元组
let (mut a,mut b) =(0,1);
if n == 0 {
return 0;
}
for _ in 1..n {
// 元组解构
(a, b) = (b, a + b);
}
b
}
fn main() {
let n: u32 = 10;
println!("n = {}, fib(n) = {}", n, sum_f(n));
}
练习总结
<font color=“409EFF”>切记分清楚哪些数据是直接通过栈复制而不进行所有权转移</font>
默认实现 Copy 的类型
| 类型 | 说明 |
|---|---|
i8, i16, i32, i64, i128, isize |
有符号整数 |
u8, u16, u32, u64, u128, usize |
无符号整数 |
f32, f64 |
浮点数 |
bool |
布尔值 |
char |
Unicode 字符 |
()(单元类型) |
空元组 |
不可变引用 &T |
引用本身可 Copy,但指向的数据不一定 |
数组 [T; N](如果 T 是 Copy) |
例如 [i32; 5] 是 Copy |
元组 (T1, T2, ...)(如果所有成员都是 Copy) |
例如 (i32, bool) 是 Copy |
默认不实现 Copy 的类型
| 类型 | 说明 |
|---|---|
String |
堆分配的字符串 |
Vec<T> |
动态数组 |
Box<T> |
堆分配的指针 |
Rc<T>, Arc<T> |
引用计数指针 |
Mutex<T>, RwLock<T> |
线程同步类型 |
可变引用 &mut T |
可变引用不可 Copy |
关键区别
Copy类型:可以通过一对一直接内存复制来创建副本的数据类型,赋值、传参、返回时自动复制(栈复制),原变量仍可用。- 非
Copy类型:需要通过特殊复制逻辑来创建(或无法创建)副本的数据类型,赋值、传参、返回时转移所有权(Move),原变量失效。