Rust 語法上一個變量的值是轉移給另外一個變量, 可是有些狀況下可能會想變量值轉移以後, 自身還能繼續使用. 可使用 clone
函數函數
let a = String::from("test");
let b = a.clone();
println!("{}", a);
複製代碼
clone
這個函數是在標準庫的 std::clone::Clone
trait 裏, 既然是個 trait, 也就意味着能夠本身實現一套操做, 一般狀況下用默認的定義就行了.ui
咱們如今瞭解到每次綁定變量, 都會發生全部權轉移, 可是你會發現寫有些東西的時候好像行爲跟目前的認知有點不同.spa
let a: i32 = 10;
let b = a;
println!("a = {}", a); // a = 10
複製代碼
a
沒有使用 clone
還能使用, 緣由是 Rust 有部分類型默認實現了 std::marker::Copy
trait. 像 structs
這類沒有默認實現的類型, 想要這樣就得實現一下 Copy
.code
fn main() {
let p1 = Point { x: 1.0, y: 1.0 };
let p2 = p1;
println!("p1 = {:?}", p1);
}
#[derive(Debug)]
struct Point {
x: f64,
y: f64,
}
impl Copy for Point {}
複製代碼
可是其實這樣仍是無法用的, 編譯後就報錯了, 由於 struct Point
沒有實現 Clone
trait.string
pub fn main() {
let p1 = Point { x: 1.0, y: 1.0 };
let p2: Point = p1;
println!("p1 = {:?}", p1);
}
#[derive(Debug)]
struct Point {
x: f64,
y: f64,
}
impl Clone for Point {
fn clone(&self) -> Self {
Self { x: self.x, y: self.y }
}
}
impl Copy for Point {}
複製代碼
如今終於好使了. 可是咱們發覺作這些操做很是煩, 咱們注意到 #[derive(Debug)]
這個東西, 恰好 Rust 提供了Clone
, Copy
的屬性.it
pub fn main() {
let p1 = Point { x: 1.0, y: 1.0 };
let p2: Point = p1;
println!("p1 = {:?}", p1);
}
#[derive(Debug, Clone, Copy)]
struct Point {
x: f64,
y: f64,
}
複製代碼
Rust 默認綁定變量是進行 move
行爲, 想要保留 move
前的變量, 可使用 clone
函數, 想要實現基本類型同樣的 copy
行爲, 咱們能夠添加 Clone
, Copy
屬性.io