Rust 1.100 正式推出 十年爭議後 Never 型別終於穩定

Rust 團隊於 2026 年 11 月 12 日發布 Rust 1.100.0,版本號首次進入三位數。這次更新最受注目的是 Never 型別(程式碼中的 !)在經歷十年討論與五次失敗的穩定化嘗試後正式落地,標準庫的 Allocator API 與 core::mem::DropGuard 亦同步穩定[1]。已安裝 rustup 的用戶可直接以 rustup update stable 升級。

Never 型別與其相容性代價

Never 型別代表永遠不會產生值的計算類型,return、break、std::process::exit 等表達式本身就屬於 ![2]。過去 ! 只能在函式回傳型別等少數位置書寫,1.100 起可以在任何位置命名,例如 Result;! 可強制轉換為任何型別的規則亦保留,令 match 分支可以直接 return 而不需補上值。

穩定化的關鍵一步是把 Infallible 改為 Never 型別的別名,使舊有 API 與 ! 互通。代價是一項 breaking change:2015、2018、2021 三個 edition 的 never type fallback 由 () 改為 !,與 2024 edition 保持一致[1]。官方稱大多數程式碼不受影響,但少數情況下(例如忽略一個回傳泛型參數的函式結果)行為會改變,編譯器亦可能判定更多程式碼為不可達。團隊已提前發出相容性警告,並修正多個受影響的公開 crate。

配置器與作用域退出工具

Allocator API 的核心部分穩定,Vec 與 Box 可以使用自訂配置器,相關方法包括 Vec::new_in、Box::new_in 等。官方定位這是 Allocators 1.0 專案目標的基礎,未來會擴展至更多集合與指標型別。

core::mem::DropGuard 針對「函式離開時一定要執行某些程式碼」的場景:它包住一個變數與一個閉包,被 drop 時執行閉包並消耗變數,另提供 dismiss 方法取回變數而不執行解構,方便實作全有或全無的交易式 API。至於 std::mem::conjure_zst,則是首個專門用於安全地憑空造出零大小型別值的函式;由於部分 API 依賴這類型別不可被建構來維持安全(例如 PyO3 的 GIL 標記),此函式標記為 unsafe[1]。

Cargo 的供應鏈與建置改動

Cargo 新增未使用依賴警告,透過 [lints.cargo] 控制,預設為 warn;限制是必須建置所有可能用到該依賴的 target 才會顯示。建置目錄改用按建置步驟分層的佈局,並把 build configuration hash 移到父目錄,減少快取碰撞與不必要的重編,但官方提醒這項內部改動可能影響倚賴舊佈局的建置流程與測試。

另一項與安全相關的是 min-publish-age,亦即依賴冷卻期[1]。開發者可在 .cargo/config.toml 設定 global-min-publish-age = "3 days",Cargo 解析版本時會跳過發布未滿三日的版本,並列出被暫緩的版本。需要即時採用新版本時,可用 CARGO_RESOLVER_INCOMPATIBLE_PUBLISH_AGE=allow 單次覆寫。要注意 cargo install 不受此限制,官方亦強調冷卻期只降低部分供應鏈攻擊風險,不能取代依賴審查。

升級注意

升級只需執行 rustup update stable。企業與 CI 環境應優先檢查兩點:其一,舊 edition 專案有否依賴 never type fallback 的舊行為;其二,建置腳本或測試有否針對舊 Cargo 建置目錄佈局寫死路徑。官方建議先在 beta 或 nightly 通道測試,並回報任何問題。

參考資料

[1] Announcing Rust 1.100.0(2026-11-12)

[2] Rust 標準庫文件:primitive never

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

*