Rust團隊發布了最新Rust 1.41版本,放寬Trait實作的限制,同時也改進Cargo的安裝,而且這個版本將是最後支援32位元蘋果系統的版本。

官方提到,由於在Rust 1.41孤立規則(Orphan Rule)太過嚴格,阻礙了組合(Composition)。孤立規則是用來預防相依性項目,在添加新Trait實作時造成破壞,也就是說只有在當前區域Crate中而非外部Crate時,Rust才會允許Trait或是類型實作。

但是這限制遇到泛型時,情況就變得複雜,當Crate定義了BetterVec<T>結構,而開發者想要把該結構轉換成標準函式庫的Vec<T>,程式碼寫作impl<T> From<BetterVec<T>> for Vec<T>{// ...},在Rust 1.40中,這個寫法違反孤立原則,因為From和Vec都是定義在標準函式庫,對於當前Crate來說是外部的Trait與類型,雖然有許多辦法可以繞過這個限制,但除了過程繁瑣之外,也無法適用所有案例。

上述案例在Rust 1.41中,From和Vec仍然為外部的Trait與類型,但是Trait將會透過區域類型參數化,因此在最新版本這個實作是可行的。

在最新版本中,Cargo安裝還會更新過時的套件。Cargo安裝可以用來安裝二進位Crate,開發人員常用來安裝以Rust撰寫的CLI工具,而從Rust 1.41開始,當Crate有新版本釋出的時候,Cargo安裝將會更新該Crate到最新版本。

另外,為了維持建置的一致性,Cargo會使用名為Cargo.lock的檔案,其中包含了相依項目版本與校驗和,但是在獨立的分支中變更相依項目的時候,該檔案的資料排列方式容易產生合併衝突,而從Rust 1.41開始,將開始採用能夠避免衝突的新格式,但只有新的鎖定檔案會使用新格式,原有檔案將還是使用之前的格式。

Rust將降低32位元Apple裝置的支援程度到Tier 3,而這代表相關程式無法以rustup安裝程式下載,並且在自動建置的過程也會被忽略,Rust開發團隊表示,主要影響的目標是i686 apple darwin,無論是在32位元Mac硬體上使用編譯器,或是在其他平臺交叉編譯的32位元二進位檔都會受到影響,遭到降級的還有armv7-apple-ios、armv7s-apple-ios與i386-apple-ios。

由於Apple放棄支援MacOS 10.15和iOS 11的32位元檔案,並且還防止開發者從Xcode 10交叉編譯32位元的程式,因此Rust降級的這些目標,對開發者來說本來就沒用。開發者仍可以繼續使用Rust 1.41建置32位元二進位檔,在2020年3月12日發布下一個穩定版本之前,Rust開發團隊還是會提供重大錯誤修復與安全補丁。


熱門新聞

Advertisement