示例程序:
fn main() {
let x = 123;
let y = x;
println!("x = {}, y = {}", x, y); // 輸出 x = 123, y = 123
}
上述程序中,在創建變量 y 之后,變量 x 繼續有效。(而不會想 String 的賦值一樣發生移動)
這是因為對於包括整型在內的一些類型來說,在編譯時可以得知自己的大小,並且能夠將自己的數據完整地存儲在棧內存中。因為數據的拷貝全部發生在棧內存中,所以不會有移動的行為發生,所以此時就是完整地數據的拷貝。
Rust 提供了一個名為 Copy 的 trait,它可以應用在諸如整數這樣完整地存儲在棧上的數據類型。
一旦某種數據類型擁有了 Copy trait,它的變量就可以在賦值給其他變量之后保持可用性。
如果一種類型本身或者這種類型的任意成員實現了 Drop trait,那么 Rust 就不允許其實現 Copy trait。嘗試在給某個需要在離開作用域時執行特殊指令(即實現了drop)的類型實現 Copy 這種 trait 會導致編譯時錯誤。
擁有 Copy trait 的數據類型
- 所有的整數類型,比如 u32。
- 布爾類型:bool。
- 字符類型:char。
- 所有的浮點類型,比如 f64。
- 如果元組包含的所有字段都是 Copy 的,那么這個元素也是 Copy 的。例如:
(i32, i32)
是 Copy 的,但(i32, String)
則不是。