全類型

2018-08-12 22:03 更新

全類型

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

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

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

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

impl Foo for str {

impl<TFoo for [T] {

相反,你必須這樣寫:

impl Foo for &str {

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

?Sized

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

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

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

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號