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 Box<T>
Box <T>
是一個智能指針,指向在類型爲T的堆上分配的數據。Box <T>
允許將數據存儲在堆而不是堆棧上。Box <T>
是一個擁有的指針。
除了將數據存儲在堆上之外,Box
沒有性能開銷。
當Box
離開作用域時,會調用析構函數來銷燬所有內部對象並釋放內存。
使用Box <T>
將數據存儲在堆上。
主要是,Box <T>
用於在堆上存儲數據。下面通過一個簡單的例子來理解這一點:
fn main()
{
let a = Box :: new(1);
print!("value of a is : {}",a);
}
執行上面示例代碼,得到以下結果 -
value of a is : 1
在上面的例子中,a
包含指向數據1
的Box
的值。如果訪問Box
的值,則程序打印‘1’。 當程序結束時,Box
被解除分配。Box
存儲在堆棧中,它指向的數據存儲在堆上。
下面來看看上面例子的圖解表示:
Cons列表
-
Cons
代表「構造功能」。 -
Cons
列表是一個數據結構,用於從兩個參數構造一個新對,這對稱爲List
。 - 假設有兩個元素
x
和y
,那麼cons
函數cons 「x到y」
表示通過首先放置元素x
,然後是元素y
來構造新容器。 -
Cons
列表包含兩個元素,即當前項和最後一項。 由於Nil
不包含下一個項目,因此缺點列表的最後一項是Nil
。
現在,創建包含cons
列表的枚舉。
enum List
{
cons(i32, List),
Nil,
}
在上面的代碼中,創建了List
類型的枚舉,其中包含i32
值的cons
列表數據結構。
現在,在以下示例中使用上面的List
類型:
enum List {
Cons(i32, List),
Nil,
}
use List::{Cons, Nil};
fn main()
{
let list = List::Cons(1,Cons(2,Cons(3,Nil)));
for i in list.iter()
{
print!("{}",i);
}
}
執行上示例代碼,得到以下結果 -
在上面的示例中,Rust編譯器拋出錯誤「具有無限大小」,因爲List類型包含遞歸的變體。 因此,Rust無法找出存儲List值所需的空間。 使用Box <T>
可以克服無限大小的問題。
使用Box <T>
獲取遞歸類型的大小
Rust無法確定存儲遞歸數據類型需要多少空間。 Rust編譯器在前一種情況下顯示錯誤:
= help: insert indirection (e.g., a 'Box', 'Rc', or '&') at some point to make 'List' representable
在上面的例子中,可以使用Box <T>
指針,因爲編譯器知道Box <T>
指針需要多少空間。 Box <T>
指針的大小在程序執行期間不會改變。 Box <T>
指針指向將存儲在堆上而不是cons
變量中的List值。 Box <T>
指針可以直接放在cons
變量中。
下面來看一個簡單的例子 -
#[derive(Debug)]
enum List {
Cons(i32, Box<List>),
Nil,
}
use List::{Cons, Nil};
fn main()
{
let list = Cons(1,Box::new(Cons(2,Box::new(Cons(3,Box::new(Nil))))));
print!("{:?}",list);
}
執行上面示例代碼,得到以輸出結果如下 -
Cons(1, Cons(2, Cons(3, Nil)))