Rust 未繫結可變引用 和繫結可變引用的區別

2021-08-30 06:33:34 字數 1162 閱讀 8685

在rust documents api 中 我們經常會看到如下的寫法

//繫結可變引用

let f = &mut string::from("what something");

//可變繫結

let mut f = string::from("what something");

這兩種語法的區別是很大的。比如在如下**中:

fn main()

j.push('.');

print!("{}\n",j);

}

fn main()

j.push('.');

print!("{}\n",j);

}

第一種寫法會編譯報錯。而第二種寫法則可以正常執行。其原因是rust的所有權規則

在rust中 所有值(分配在堆上或者分配在棧上的記憶體)有且只有乙個稱之為所有者的變數(繫結)。

值有且只有乙個所有者。當所有者離開作用域時,這個值(記憶體)將被丟棄。

在第一種寫法中,"string::from("what something")並沒有乙個所有者變數。這叫做乙個temporary value臨時值(記憶體),其作用域為當前作用域。且其任何的不可變引用或可變借用在其離開作用域之後都會無效。

因此,j = f在遇到第乙個}時無效。此時j指向的值被丟棄。編譯器會報錯。

在第二種寫法中,f 是string::from("what something")的擁有者,當呼叫j = fstring::from("what something")被移動到了j變數中,因此在第乙個}之後記憶體並被沒有被**。所以第二種寫法可以編譯通過。

當在函式呼叫時,我們需要一些臨時變數來當作引數值,並確定之後不會使用,則可以使用&mut string::("what something")這在某些時候是很有用的。

然而,如果我們不想rustc釋放掉某塊記憶體,我們必須指定乙個記憶體的所有者,並通過移動語義確保其所有者有效。

rust學習可變與引用過程理解

mut可變性 rust學習的第乙個與其他語言不同點便是變數初始化後的使用。let a 1 println a a a 2 println a 2 a 上段 編譯報錯 cannot assign twice to immutable variable 說明rust簡單初始化變數是不具有可變性,不可修改...

Rust中的可變引用(存在一些問題)

示例程式 fn main s 輸出 yuyoubei fn make yuyoubei s mut string 使用使用 mut來修飾函式呼叫時的可變引用 函式宣告時也需要 mut來修飾函式型別。例如下面的程式是錯誤的 fn main r2 r1,r2 會提示出錯 error e0499 cann...

EXCEL相對引用,絕對引用和混合引用的區別

相對引用 絕對引用和混合引用是指在公式中使用單元格或單元格區域的位址時,當將公式向旁邊複製時,位址是如何變化的。具體情況舉例說明 當將公式複製到c2單元格時變為 a2 b2 當將公式複製到d1單元格時變為 b1 c1 當將公式複製到c2單元格時仍為 a 1 b 1 當將公式複製到d1單元格時仍為 a...