Rust引用和借用

引用是作爲參數傳遞給函數的地址。借用就像我們借一些東西,如果已經完成借用,需要還給原所有者。 引用和借用是相互的,即當引用被釋放時,借用也結束。

爲什麼要借用?

使用借用概念的原因如下:

  • 借用允許對單個資源進行多次引用,但仍然遵守「單一所有者」。
  • 引用就像C中的指針一樣。
  • 引用是一個對象。 引用有兩種類型,即可變引用和不可變引用。 在複製不可變引用時移動可變引用。

下面通過一個例子來理解這一點。

 fn main()  
{  
 let str=String::from("Yiibai");  
 let len=calculate_length(&str);  
 println!("length of the string {}",len);  
}  
fn calculate_length(s:&String)->usize  
{  
  s.len()  
}

執行上面示例代碼,得到以下結果 -

length of the string 6

在上面的示例中,calculate_length()函數對字符串str的引用作爲參數而不取其所有權。

let str=String::from("Yiibai");  
let len=calculate_length(&str);

在上面的場景中,&str是對變量str的引用,但它並不擁有它。 因此,即使引用超出範圍,也不會刪除引用指向的值。

fn calculate_length(s:&String)->usize  
s.len()

在上面的例子中,變量s有效,直到控制沒有返回main()函數。 當變量作爲函數的引用而不是實際值傳遞時,不需要返回值到返回所有權。

下面嘗試修改借用的值。

fn main()  
{  
 let x=1;  
 value_changed(&x)  
}  
fn value_changed(y:&i32)  
{  
 *y=9;  
}

以下是上述程序的輸出:

Rust引用和借用

在上面的示例中,它會引發錯誤,因爲&x是不可變引用。 因此,無法改變y的值。

可變引用

可以通過使用可變引用來修復上述錯誤。可變引用是那些可以改變的引用。下面通過一個例子來理解這一點。

fn main()  
{  
 let mut x=1;  
 value_changed(&mut x);  
 println!("After modifying, the value of x is {}",x);  
}  
fn value_changed(y:&mut i32)  
{  
 *y=9;  
}

執行上面示例代碼,得到以下結果 -

After modifying, the value of x is 9

在上面的例子中,創建了一個可變引用,即&mut x,引用由變量y指向,它是&i32類型。 現在,可以更改y變量引用的值。分配9個值,即* y = 9。 因此,x的值也變爲9,作爲兩個變量引用的相同內存位置。

可變引用的限制

只能對特定範圍內的一段數據進行一次可變引用。
例如:

let mut str=String::from("Yiibai");  
let a= &mut str;  
let b= &mut str;

在上面的場景中,編譯器拋出一個錯誤,因爲它包含兩個在Rust語言中不可能的可變引用。如果程序中存在不可變引用,那麼程序中就不能有可變引用。
例如:

let mut str=String::from("Yiibai");  
let a= &str;  
let b=&str;  
let c=&mut str;

在上面的場景中,編譯器拋出一個錯誤,因爲當有一個不可變引用時,不能有一個可變引用。