Rust 1.78 已將其捆綁的 LLVM 升級到版本 18,完成了針對 x86-32 和 x86-64 目標的已宣布的 u128/i128 ABI 變更。使用自己的 LLVM 且版本低於 18 的發行商可能仍會面臨該文章中提到的呼叫約定錯誤。Rust 1.78 已將其捆綁的 LLVM 升級到版本 18,完成了針對 x86-32 和 x86-64 目標的已宣布的 u128/i128 ABI 變更。使用自己的 LLVM 且版本低於 18 的發行商可能仍會面臨該文章中提到的呼叫約定錯誤。

Rust 1.78.0:有什麼新功能?

2025/12/08 02:45

Rust 團隊很高興宣布 Rust 的新版本 1.78.0。Rust 是一種程式語言,賦予每個人建立可靠且高效軟體的能力。

\ 如果您已經通過 rustup 安裝了舊版本的 Rust,您可以使用以下命令獲取 1.78.0:

$ rustup update stable

\ 如果您還沒有安裝,可以從我們網站上的相應頁面獲取 rustup,並查看 1.78.0 的詳細發布說明。

\ 如果您想通過測試未來的版本來幫助我們,您可以考慮在本地更新以使用 Beta 通道(rustup default beta)或 Nightly 通道(rustup default nightly)。請報告您可能遇到的任何錯誤!

1.78.0 穩定版中的新功能

診斷屬性

Rust 現在支援 #[diagnostic] 屬性命名空間來影響編譯器錯誤訊息。這些被視為提示,編譯器不必須使用它們,提供編譯器無法識別的診斷也不會被視為錯誤。這種靈活性允許原始碼提供診斷,即使它們不被所有編譯器支援,無論是不同版本還是完全不同的實現。

\ 隨著這個命名空間的出現,第一個支援的屬性是 #[diagnostic::on_unimplemented],它可以放在特徵上,以自定義當該特徵被要求但尚未在類型上實現時的訊息。考慮穩定化拉取請求中給出的例子:

#[diagnostic::on_unimplemented( message = "My Message for `ImportantTrait<{A}>` is not implemented for `{Self}`", label = "My Label", note = "Note 1", note = "Note 2" )] trait ImportantTrait<A> {} fn use_my_trait(_: impl ImportantTrait<i32>) {} fn main() { use_my_trait(String::new()); }

\ 以前,編譯器會給出這樣的內建錯誤:

error[E0277]: the trait bound `String: ImportantTrait<i32>` is not satisfied --> src/main.rs:12:18 | 12 | use_my_trait(String::new()); | ------------ ^^^^^^^^^^^^^ the trait `ImportantTrait<i32>` is not implemented for `String` | | | required by a bound introduced by this call |

\ 使用 #[diagnostic::on_unimplemented] 後,其自定義訊息填充主要錯誤行,其自定義標籤放置在源輸出上。原始標籤仍作為幫助輸出寫入,任何自定義註釋也會被寫入。(這些確切細節可能會有所變化。)

error[E0277]: My Message for `ImportantTrait<i32>` is not implemented for `String` --> src/main.rs:12:18 | 12 | use_my_trait(String::new()); | ------------ ^^^^^^^^^^^^^ My Label | | | required by a bound introduced by this call | = help: the trait `ImportantTrait<i32>` is not implemented for `String` = note: Note 1 = note: Note 2

\ 對於特徵作者來說,如果您能提供比僅僅談論缺失的實現本身更好的提示,這種診斷會更有用。例如,這是標準庫中的一個簡化示例:

#[diagnostic::on_unimplemented( message = "the size for values of type `{Self}` cannot be known at compilation time", label = "doesn't have a size known at compile-time" )] pub trait Sized {}

\ 有關更多信息,請參閱參考部分中關於 diagnostic 工具屬性命名空間的內容。

斷言 unsafe 前提條件

Rust 標準庫有許多用於 unsafe 函數前提條件的斷言,但歷史上它們只在標準庫的 #[cfg(debug_assertions)] 構建中啟用,以避免影響發布版本的性能。然而,由於標準庫通常以發布模式編譯和分發,大多數 Rust 開發者根本沒有執行這些檢查。

\ 現在,這些斷言的條件延遲到代碼生成時,因此它們將根據用戶自己的調試斷言設置進行檢查——在調試和測試構建中默認啟用。這一變更幫助用戶捕捉代碼中的未定義行為,儘管檢查的具體細節通常不穩定。

\ 例如,slice::from_raw_parts 需要一個對齊的非空指針。以下故意使用未對齊指針的行為是未定義的,雖然如果您不幸的話,過去它可能看起來是"有效的",但現在調試斷言可以捕捉到它:

fn main() { let slice: &[u8] = &[1, 2, 3, 4, 5]; let ptr = slice.as_ptr(); // Create an offset from `ptr` that will always be one off from `u16`'s correct alignment let i = usize::from(ptr as usize & 1 == 0); let slice16: &[u16] = unsafe { std::slice::from_raw_parts(ptr.add(i).cast::<u16>(), 2) }; dbg!(slice16); } thread 'main' panicked at library/core/src/panicking.rs:220:5: unsafe precondition(s) violated: slice::from_raw_parts requires the pointer to be aligned and non-null, and the total size of the slice not to exceed `isize::MAX` note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace thread caused non-unwinding panic. aborting.

確定性重對齊

標準庫有一些改變指針和切片對齊方式的函數,但它們以前有一些使它們在實踐中難以依賴的注意事項,如果您嚴格按照它們的文檔。這些注意事項主要是為了防範 const 評估,但它們無論如何只對非 const 使用穩定。現在它們承諾根據實際輸入具有一致的運行時行為。

  • pointer::align_offset 計算將指針更改為給定對齊所需的偏移量。如果不可能,它返回 usize::MAX,但以前允許它始終返回 usize::MAX,現在這種行為已被移除。
  • slice::align_toslice::align_to_mut 都將切片轉換為對齊的中間切片以及剩餘的未對齊頭尾切片。這些方法現在承諾返回最大可能的中間部分,而不是允許實現返回不那麼理想的結果,比如將所有內容作為頭切片返回。

穩定的 API

  • impl Read for &Stdin
  • 接受非 'static 生命週期用於幾個 std::error::Error 相關實現
  • 使 impl<Fd: AsFd> 實現接受 ?Sized
  • impl From<TryReserveError> for io::Error

\ 這些 API 現在在常量上下文中穩定:

  • Barrier::new()

兼容性說明

  • 如先前宣布的,Rust 1.78 已將以下目標的最低要求提高到了 Windows 10:
  • x86_64-pc-windows-msvc
  • i686-pc-windows-msvc
  • x86_64-pc-windows-gnu
  • i686-pc-windows-gnu
  • x86_64-pc-windows-gnullvm
  • i686-pc-windows-gnullvm
  • Rust 1.78 已將其捆綁的 LLVM 升級到版本 18,完成了宣布的 x86-32 和 x86-64 目標的 u128/i128 ABI 變更。使用自己的 LLVM 且版本低於 18 的發行版可能仍會面臨該文章中提到的調用約定錯誤。

其他變更

查看 Rust、Cargo 和 Clippy 中的所有變更。

1.78.0 的貢獻者

許多人共同創造了 Rust 1.78.0。沒有你們所有人,我們無法做到這一點。謝謝!


Rust 發布團隊

\ 也發布於此處

\ 照片由 Ubaid E. Alyafizi 在 Unsplash 上提供

免責聲明: 本網站轉載的文章均來源於公開平台,僅供參考。這些文章不代表 MEXC 的觀點或意見。所有版權歸原作者所有。如果您認為任何轉載文章侵犯了第三方權利,請聯絡 service@support.mexc.com 以便將其刪除。MEXC 不對轉載文章的及時性、準確性或完整性作出任何陳述或保證,並且不對基於此類內容所採取的任何行動或決定承擔責任。轉載材料僅供參考,不構成任何商業、金融、法律和/或稅務決策的建議、認可或依據。

您可能也會喜歡

現在準備不算晚!防災小橘書必備清單,日本亞馬遜 GEUM 太陽能防災收音機,斷網時的生命線。

現在準備不算晚!防災小橘書必備清單,日本亞馬遜 GEUM 太陽能防災收音機,斷網時的生命線。

最近看新聞,總統提到希望 2026 年國防預算可以來到 GDP 的 3 % 以上。也就在 11 月 29 日的「總統與青年論壇」中,有學生表達對於中國攻打台灣這件事的關切。總統回答說:「勿恃敵之不來,恃無有以待之」,意思就是不要寄望敵人不會來,而是要做好準備隨時應對。 老實說,距離國際社會所提到的 2027 年中國要做好攻台的準備,所剩的時間其實不多了。但身為一般老百姓的我們能做什麼?其實不管未來戰爭究竟會不會開打,在事前做好準備才是我們應該做的。這不僅是對戰爭,包含颱風、地震等天災,做好準備都能發揮很大的作用。準備充分能讓內心安定,不會在危機發生時陷入恐慌。 政府發放的臺灣全民安全指引(俗稱
分享
Cool3c2025/12/09 08:02
人與人疏遠並不是壞事?8個跡象揭開閨密感情變淡的真相

人與人疏遠並不是壞事?8個跡象揭開閨密感情變淡的真相

編輯/葉佳欣撰文 如果妳發現自己跟某位朋友漸漸疏遠,可能你們曾經很親密,會在半夜時分聊心裡面的感受。但是,人會 […] 這篇文章 人與人疏遠並不是壞事?8個跡象揭開閨密感情變淡的真相 最早出現於 民生頭條。
分享
Lifetoutiao2025/12/09 08:31