开发技巧及注意事项
1、所有权转移
TIP
实现了Copy Trait的类型:
- 所有整数类型,比如u32
- 所有浮点数类型,比如f64
- 布尔类型,bool,它的值是true和false
- 字符类型,char
- 元组,当且仅当其包含的类型也都是Copy的时候。比如(i32, i32)是Copy的,但(i32, String)不是
- 共享指针类型或共享引用类型
1.1、i32
TIP
i32
默认实现了Copy Trait
, 它在进行所有权转移的时候,会自动使用Copy语义
,而不是Move语义
js
// i32默认实现了Copy Trait, 它在进行所有权转移的时候,会自动使用Copy语义,而不是Move语义
let x = 3;
let n = x;
println!("n: {}, x: {}", n, x);
// n: 3, x: 3
1.2、String
TIP
String
没有实现Copy trait
在进行所有权转移的时候使用Move语义
js
let x = String::from("hello");
let n = x;
println!("n: {}, x: {}", n, x);
// 报错
1.3、&str
TIP
&str
默认实现了Copy Trait
, 它在进行所有权转移的时候,会自动使用Copy语义
,而不是Move语义
js
// &str默认实现了Copy Trait, 它在进行所有权转移的时候,会自动使用Copy语义,而不是Move语义
let s = "hello";
let n = s;
println!("n: {}, s: {}", n, s);
// n: hello, s: hello
1.4、实现Copy
js
#[derive(Copy, Clone, Debug)]
struct Def(i32, i32);