Rust教學
Rust下載和安裝
Rust簡介
Rust Hello World
Rust的特點
Rust註釋
Rust開發環境安裝
Rust文檔
Rust第一個程序
Rust格式化打印
Rust調試
Rust顯示
測試用例:列表
Rust格式化
Rust原語
Rust常量和運算符
Rust元組
Rust數組和切片
Rust自定義類型
Rust結構
Rust可視性
Rust枚舉
Rust常量
Rust變量綁定
Rust變量綁定-可變性
Rust變量綁定-範圍和陰影
Rust變量綁定-聲明
Rust類型轉換
Rust類型轉換 - 字面量
Rust類型轉換-推導
Rust類型轉換 - 別名
Rust表達式
Rust if/else語句
Rust循環
Rust嵌套和標籤
Rust while循環
Rust for和範圍
Rust匹配/match
Rust匹配析構元組
Rust解構枚舉
Rust指針和引用
Rust解構結構
Rust Guards
Rust綁定
Rust if let
Rust while let
Rust函數
Rust方法
Rust閉包
Rust捕捉
Rust作爲輸入參數
Rust匿名類型
Rust輸入函數
Rust作爲輸出參數
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;
}
以下是上述程序的輸出:
在上面的示例中,它會引發錯誤,因爲&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;
在上面的場景中,編譯器拋出一個錯誤,因爲當有一個不可變引用時,不能有一個可變引用。