Rust官方釋出1.33新版,改進了const fn,以及加入已達穩定的新概念Pinning,能使目標物件在記憶體中保有穩定位置,直到被解除分配。

const fn的改進,讓開發者現在可以使用更多以前無法使用的語法。像是不可辯駁的解構樣式(Irrefutable Destructuring Patterns),使用方式可為const fn foo((x, y): (u8, u8)) { ... },也能使用let綁定let x = 1;和可變的let綁定let mut x = 1;這類的寫法,還能使用簡單的賦值x = y、賦值運算子表達x += y等寫法,而當賦值的目標是一個投影,像是結構欄位或是索引操作,現在能寫作x[3] = 42,而開發者也可以使用單純的表達語句3;。

另外,還在const fn中呼叫const unsafe fn也沒問題,官方提到,由於const fn的改進,更多標準函式庫中的函式可以標記為const。而在接下來的版本,繼續會也有更多const語法可用,包括可變參照&mut T,或是可辯駁的樣式Some(x),而雖然let綁定已經穩定,但是在常數中使用&&以及||卻尚未穩定,開發者還需要再等等。

第二個主要更新則是加入Pinning的概念,以std::pin::Pin<P>類型以及Unpin標記特徵實作。官方提到,Pinning對於那些保證不移動的物件有時候很有用,因為這些物件在記憶體中的位置不會移動,因此能倚賴其上,像是在建構自參照結構時,因為移動指向物件本身的指標,將使其無效,並可能出現未定義的行為。而 Pin<P>將能確保任何指標類型P都在記憶體中有穩定的位置,無法被移動到其他地方,而且在解除分配之前,都不能釋放記憶體。

這個功能主要供函式庫開發者使用,官方提到,這個API的穩定性對Rust開發者來說非常重要,因為是Rust朝向提供async/await非同步功能的重要一步。


Advertisement

更多 iThome相關內容