Rust中變數的移動move

2022-09-19 12:51:10 字數 741 閱讀 4994

示例程式:

fn main() ", s1);

}

執行這段程式會報錯,報錯資訊如下:

error[e0382]: borrow of moved value: `s1`

--> src\main.rs:4:25

|2 | let s1 = string::from("yuyoubei");

| -- move occurs because `s1` has type `string`, which does not implement the `copy` trait

3 | let s2 = s1;

| -- value moved here

4 | println!("s1 = {}", s1);

| ^^ value borrowed here after move

原因是由於string的儲存形式,它的ptr指標指向了儲存在堆記憶體上的字串。而rust不會顯式地拷貝堆記憶體上的內容。取而代之的是使用移動(move),將s1的內容轉給了s2。

這就避免了乙個二次釋放的問題,因為將 s1 的內容移動給 s2 之後,s1 便已廢棄,只有 s2 有效,所以也就只有 s2 在離開自己的作用域時會釋放空間,就不會造成二次釋放了。

Rust中變數的複製與Copy trait

示例程式 fn main y x,y 輸出 x 123,y 123 上述程式中,在建立變數 y 之後,變數 x 繼續有效。而不會想 string 的賦值一樣發生移動 這是因為對於包括整型在內的一些型別來說,在編譯時可以得知自己的大小,並且能夠將自己的資料完整地儲存在棧記憶體中。因為資料的拷貝全部發生...

rust的綠卡 rust中的Pin詳解

rust中的pin詳解 相關概念 pin這是乙個struct,作用就是將p所指向的t在記憶體中固定住,不能移動。說白一些,就是不能通過safe 拿到 mut t。pin定義如下 pub struct pin pointer p,unpin 這是乙個trait,定義在std marker中,如果乙個t...

rust中的型別

rust提供了幾種機制來實現基本型別和使用者自定義型別的轉換和定義。rust中沒有提供基本型別之間隱式地型別的轉換。但是,我們可以通過as關鍵字來進行顯示型別的轉換。在rust中,數字型別的轉換和c語言中的轉換一樣,除了c語言中的未定義的行為。整數型別之間的所有轉換情況都已經在rust中定義好了。禁...