Rust 程式設計視訊教程(進階)——027_3 高階特性 3

linghuyichong發表於2020-02-22

頭條地址:https://www.ixigua.com/i677586170644791348...
B站地址:https://www.bilibili.com/video/av81202308/

github地址:https://github.com/anonymousGiga/learn_rus...

動態大小型別(dynamically sized types),有時被稱為 “DST” 或 “unsized types”,這些型別允許我們處理只有在執行時才知道大小的型別。
(1)str 是一個 DST;直到執行時我們都不知道字串有多長。
例子://如下程式碼是錯誤的

let s1: str = "Hello there!"; 
let s2: str = "How's it going?";

正確程式碼為:

let s1: &str = "Hello there!"; 
let s2: &str = "How's it going?";

說明:
&str 則是 兩個 值:str 的地址和其長度。這樣,&str 就有了一個在編譯時可以知道的大小:它是 usize 長度的兩倍。也就是說,無論字串是多大,&str的大小我們總是知道的。
因此,引出動態大小型別的黃金規則:必須將動態大小型別的值置於某種指標之後。如:Box 或 Rc、&str等。
另一個動態大小型別是trait。每一個 trait 都是一個可以通過 trait 名稱來引用的動態大小型別。為了將 trait 用於 trait 物件,必須將他們放入指標之後,比如 &Trait 或 Box(Rc 也可以)。
(2) Sized trait
為了處理 DST,Rust 用Sized trait 來決定一個型別的大小是否在編譯時可知。這個 trait 自動為編譯器在編譯時就知道大小的型別實現。
例子:

fn generic<T>(t: T) {//T為編譯時就知道大小的型別 
    // --snip-- 
}

等價於

fn generic<T: Sized>(t: T) {//T為編譯時就知道大小的型別 
    // --snip-- 
}

如何放寬這個限制呢?Rust提供如下方式:

fn generic<T: ?Sized>(t: &T) {//T 可能是Sized,也可能不是 Sized 的 
    // --snip-- 
}
本作品採用《CC 協議》,轉載必須註明作者和本文連結

令狐一衝

相關文章