鍍金池/ 教程/ Java/ 全類型
While 循環(huán)
宏命令
模式
Rust 嵌入到其他語言
變量綁定
if
發(fā)布通道
Lang 項(xiàng)目
匹配
文檔
棧和堆
不依賴 stdlib
原始指針
條件編譯
type 別名
關(guān)聯(lián)類型
全類型
詞匯表
基本類型
Hello, world!
測(cè)試
箱和模塊
字符串
向量
引用與借用
所有權(quán)
內(nèi)斂函數(shù)
基準(zhǔn)測(cè)試
Nightly Rust
for 循環(huán)
特征
特征的對(duì)象
鏈接參數(shù)
介紹
'Deref'強(qiáng)制轉(zhuǎn)換
枚舉
內(nèi)聯(lián)匯編
泛型
方法語法
函數(shù)
外部函數(shù)接口
盒語法和模式
安裝 Rust
unsafe    
生存期
切片模式
Borrow 和 AsRef
If let
學(xué)習(xí) Rust
“常量”和“靜態(tài)”
語法和語義
迭代器
相關(guān)學(xué)術(shù)研究
通用函數(shù)調(diào)用語法
哲學(xué)家就餐問題
類型轉(zhuǎn)換
閉包
并發(fā)性
Hello, Cargo!
屬性
注釋
結(jié)構(gòu)體
編譯器插件
高效 Rust
相關(guān)常量
猜謎游戲
可變性
錯(cuò)誤處理
新手入門
操作符和重載

全類型

大多數(shù)類型都有一個(gè)特定的大小,以字節(jié)為單位,是在編譯時(shí)可知。例如,一個(gè) 32 位大的 i32 或四個(gè)字節(jié)。然而,也有一些用于表達(dá)的類型,但沒有指定的大小。這些被稱為全類型或動(dòng)態(tài)大小類型。有一個(gè)例子是[T]。這個(gè)類型代表了序列中一定數(shù)量的 T。但是我們不知道有多少,所以不知道大小。    

Rust 使用許多這樣的類型,但是他們有一些限制。有如下三種:     

  1. 我們只能通過指針操作一個(gè)全類型的實(shí)例。一個(gè) &[T] 就可以了,但[T]不可以?! ?/li>
  2. 變量和參數(shù)沒有動(dòng)態(tài)大小類型?! ?/li>
  3. 只有 struct 的最后一個(gè)字段可能有一個(gè)動(dòng)態(tài)大小類型;其他字段沒有。動(dòng)態(tài)大小類型?!  ?/li>

所以,為什么要找麻煩呢?好吧,因?yàn)?[T] 只能在指針后使用如果我們沒有語言支持全類型,就不可能寫出下面代碼:

impl Foo for str {

impl<TFoo for [T] {

相反,你必須這樣寫:

impl Foo for &str {

這意味著,只能實(shí)現(xiàn)引用,而不是指針的其他類型。impl str,所有指針,包括(在某種程度上,首先有一些bug要修復(fù))用戶定義的定制智能指針,可以使用這個(gè) impl。

?Sized

如果你想寫一個(gè)接受一個(gè)動(dòng)態(tài)大小類型的函數(shù),你可以使用特殊的約束,?Sized:

struct Foo<T: ?Sized> {
f: T,
}

這個(gè)?,讀作“T可能的大小”,意味著這個(gè)綁定很特別:它讓我們匹配更多的種類,而不是更少。就像每一個(gè) T 隱式包含 T: Sized,并且?可以撤銷默認(rèn)。

上一篇:內(nèi)聯(lián)匯編下一篇:可變性