參照是作為引數傳遞給函式的地址。借用就像我們借一些東西,如果已經完成借用,需要還給原所有者。 參照和借用是相互的,即當參照被釋放時,借用也結束。
使用借用概念的原因如下:
下面通過一個例子來理解這一點。
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;
}
以下是上述程式的輸出:
在上面的範例中,它會引發錯誤,因為&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;
在上面的場景中,編譯器丟擲一個錯誤,因為當有一個不可變參照時,不能有一個可變參照。