Rust基金會發布第三個Rust語言版本Rust 2021的計畫,官方預計會在10月的時候釋出,該版本會有許多細微的改變,目的是希望能大幅改善Rust的開發體驗。

在過去幾個月,Rust 2021工作組針對新版本提出了許多建議,現在官方釋出了最終清單,這些功能都是滿足兩項條件才被加入到清單中,第一是該功能必須獲得適當的Rust團隊核准,第二則是該功能已經有一定的基礎,能夠按計畫在時間內完成。

官方將會改善Rust 2021標準函式庫中的Prelude,Prelude是一個模組,其包含了所有模組需要自動導入的內容,例如Option、Vec、drop和Clone等常用的項目,Rust編譯器會優先處理手動導入的項目,使其先於Prelude,以確保Prelude中的內容,不會破壞現有的程式碼。

但是官方提到,在Prelude中加入Trait,卻可能破壞現有程式碼,像是導入std中的TryInto的同時,使用MyTryInto Trait呼叫x.try_into()就會造成模稜兩可的情況,因為具有相同名稱而無法編譯,這也是官方之所以過去未將TryInto加到Prelude中的原因,因為很多程式碼會因此受到破壞。

在Rust 2021則有了新的解決方案,Rust 2021將使用新的Prelude,除了所有功能會與目前相同之外,還加入了三個新功能,std::convert::TryInto、std::convert::TryFrom以及std::iter::FromIterator。

而陣列的IntoIterator實作方式也將在Rust 2021獲得改進,在Rust 1.53前,僅提供參照陣列實作IntoIterator的方法,也就是說開發者可以走訪&[1, 2, 3]以及&mut[1, 2, 3],但是卻不能直接走訪[1, 2, 3]。官方解釋,這是一個長期存在的問題,解決的辦法並不簡單,直接添加Trait實作會嚴重破壞現有的程式碼。

有開發者多次建議只在Rust 2021中實作陣列IntoIterator,但官方表示,這個作法也完全不可行,因為不能只在一個版本中實作Trait,而另一個版本卻沒有這個Trait,因為在Rust中,各版本必須要可以混用。

因此官方取而代之的方法,是在Rust 1.53後所有版本實作Trait,並且加入一個小手段來避免Rust 2021之前的程式碼損壞。對Rust 2015和2018程式碼,編譯器行為將如同過去一樣,會將array.into_iter()解析為(&array).into_iter(),就像是Trait實作不存在一樣,這樣的小手段只會用在.into_iter()方法呼叫語法,而不會影響其他語法。

Rust 2021為了要為新語法做準備,因此要把一些前綴辨識符號和文字列為保留字,像是prefix#identifier、prefix"string"、prefix'c'以及prefix#123,另外的重大變化,則是巨集現在可以接受hello"world",這將會被視為兩個獨立的符號hello和“world”,兩者中間會自動加入一個空白。其他未來會加入的新前綴包括格式化字串的簡寫f“”,效果等同於format_args!(),還有以空字元結尾的C字串,將可以使用c""或是z""。

Rust 2021會成為Rust 1.56.0版本,新功能測試預計將會在9月的時候完成,並且經過6個月的Beta測試後,在10月21日正式釋出。

官方解釋,之所以Rust需要有主要版本的設計,是為了解決向後不相容的問題。從Rust 1開始,只要功能上到穩定版本,官方就會在未來所有發布版本中提供支援,但是有時候需要對語言進行一些微小、但是不向後相容的修改,像是加入新的關鍵字,這個變更將會使過去使用相同名稱的變數失效,而主要版本便是官方用來解決此問題的機制,當官方想要發布向後不相容的功能時,就會放在新的Rust版本中,供開發者依照需求選擇使用Rust的版本。


熱門新聞

Advertisement