最受歡迎程式語言rust:新增2021 edition功能,並將在10月釋出| 端客戶日報

最受歡迎程式語言rust:新增2021 edition功能,並將在10月釋出| 端客戶日報

新智元報道

編輯:好睏

【新智元導讀】

最受歡迎的程式語言Rust,在官方部落格中更新了2021 edition的計劃,該計劃將於10月釋出,其中新的功能備受網友們的期待。

Rust語言是一種高效、可靠的通用高階語言,同時兼顧了開發效率和執行效率。Rust除了能夠勝任效能敏感的任務以外,也在記憶體和執行緒安全方面有著極高的可靠性。

在更新了1。52。1後,Rust又宣佈了2021版本新的計劃:在10月份釋出1。56。

最受歡迎程式語言rust:新增2021 edition功能,並將在10月釋出| 端客戶日報

目前的1。52。1版本主要是針對增量編譯產生的錯誤提供了臨時的解決方案:

禁用 Rust 編譯器中的增量編譯(如需開啟,則設定環境變數RUSTC_FORCE_INCREMENTAL = 1)。

對於啟用了增量編譯的場景,改進了用於新驗證的診斷輸出,指示瞭如何透過清除增量狀態或禁用增量來解決錯誤。

用過的都說:真香!

你或許不知道,Rust在stackoverflow的調查中連續五年被選為最受開發者喜愛的程式語言。更是有不少知名巨頭將Rust語言加入到他們的專案中。

最受歡迎程式語言rust:新增2021 edition功能,並將在10月釋出| 端客戶日報

在使用者喜愛榜中Rust一騎絕塵,根本看不到第二名在哪兒

Microsoft正在將Rust整合到大型的專案中。有大約70%漏洞都與記憶體安全有關,於是便尋求更具安全性的Rust幫助其解決這一困擾許久的問題。

Facebook則把Rust用在了原始碼控制後端的程式碼重寫上。由於Rust可以在編譯時檢查出程式碼的錯誤,從而有效地減少了bug所帶來的經濟損失。

Dropbox使用Rust對檔案同步引擎的程式碼進行了重寫。高併發的檔案同步引擎,在編寫、測試和除錯方面都十分困難,而Rust在靜態型別和編譯檢查方面要比正在使用的Python效能更強。

最受歡迎程式語言rust:新增2021 edition功能,並將在10月釋出| 端客戶日報

甚至Linux核心也即將在5。14中加入對Rust的支援,畢竟C++太爛了(不是我說的,是Linus說的)。

「C++ solves _none_ of the C issues, and only makes things worse。」

網友對即將來臨的更新很興奮!

「我已經等不及了。作為使用Python的人,我真的很想念對混合了變數的字串的簡單直觀的處理。」

最受歡迎程式語言rust:新增2021 edition功能,並將在10月釋出| 端客戶日報

「所有edition都會被永久支援。這讓Rust 2015的程式碼和Rust 2077的程式碼的融合變為可能。」

最受歡迎程式語言rust:新增2021 edition功能,並將在10月釋出| 端客戶日報

「感謝所有Rust志願者,你們是最棒的!」

最受歡迎程式語言rust:新增2021 edition功能,並將在10月釋出| 端客戶日報

2021更新計劃中都有什麼?

1. Edition 是什麼?

Rust提出了一種Edition更新形式,這種方式不會割裂生態系統。

一個向後不相容的功能將會被作為新的Rust Edition的一部分。Edition是選擇性加入的,因此,除非現有的crate明確遷移到新版本中,否則就不會看到這些變化。

一個Edition中的crate可以與其他Edition中編譯的crate無縫地互操作。不管Edition如何,所有 Rust程式碼最終都會在編譯器中編譯為相同的內部 IR。

Edition的遷移也幾乎是全自動的。在釋出新Edition的同時,會附帶一個自動遷移工具。除此以外,還有一本《版本遷移指南》,該指南既是版本的概述,也是在遇到問題的故障排除參考。

在對舊的版本進行遷移時,需要對程式碼進行一些小的更改。例如,當遷移到Rust 2018時,所有的「async」都會變為:「r#async」。

2. prelude中新的內容

Rust編譯器會優先處理手動匯入的項,使得在prelude新增的內容不會破壞任何現有程式碼。

例如,一個名為「example」的crate或module,其中包含「pub struct Option ;」,那麼可以透過使用「example::*;」,使得「Option」明確引用「example;」而不是標準庫中的。

但是,在prelude中新增特徵便可能會破壞現有程式碼。例如,在使用「MyTryInto」特徵呼叫「x。try_into()」時,如果還匯入了「std」的「TryInto」,則會出現無法編譯的情況,因為它提供了具有相同名稱的方法。

作為解決方案,Rust 2021將使用新的prelude,其中增加了三個新的功能:

3. 預設使用Cargo功能解析器

自1。51。0起,Cargo在選擇加入中有了對新的功能解析器的支援,該功能可以在「Cargo。toml」中使用「resolver = “2”」啟用。

從Rust 2021開始,這將是預設設定。也就是說,在「Cargo。toml」中寫入「edition = “2021”」就意味著「resolver = “2”」。

4. 陣列迭代器IntoIterator

在Rust 1。53。0之前,「IntoIterator」只能用於陣列的引用。也就是說可以遍歷「&[1, 2, 3]」和「&mut [1, 2, 3]」,但不能直接遍歷「[1, 2, 3]」。

團隊在1。53。0之後所有版本中新增特徵實現。在Rust 2015和2018程式碼中,編譯器仍會將「 array。into_iter()」解析為「(&array)。into_iter()」。

這僅適用於「。into_iter()」呼叫語法, 而不會影響任何其他語法,例如「for e in [1, 2, 3]」,「iter。zip([1, 2, 3])」或「IntoIterator::into_iter([1, 2, 3])」。

5. 閉包(closures)的捕獲

閉包會自動從程式碼塊中捕獲所有的引用。例如,「|| a。 + 1」會自動從周圍的上下文中捕獲對「a」的引用,不僅僅是「a。x」。這會在某些情形下造成問題。

當結構的某個欄位被借用或移出時,其他欄位將無法再用於閉包中,因為整個結構都會因為被捕獲而變得不再可用。

從Rust 2021開始,閉包將僅捕獲其使用的欄位。

由於這個變化會對欄位的刪除順序造成影響,目前僅在新版本中被啟用。如果像以前一樣捕獲整個結構,則可透過在閉包中插入「let _ = &a; 」得到。對於其他版本,可以使用自動遷移,從而更新相關的閉包。

6. Panic宏的一致性

「panic!()」宏僅在使用多個引數呼叫時才使用字串格式。當使用單個引數呼叫時,它甚至不會檢視該引數。

一旦隱式格式引數被確定,就會出現問題了。此時「println!(“hello ”)」會變成「println!(“hello {}”, name)」的簡寫形式。但是「panic!(“hello ”)」無法執行,因為「panic!()」不會將單個引數作為格式化字串處理。

為了避免這種情況,Rust 2021提供了更具一致性的「panic!()」宏。新的「panic!()」宏將不再接受任意表達式作為唯一引數。而是像「println!()」一樣,始終將第一個引數作為格式化字串處理。

由此「panic_any()」便成為了對格式化字串以外的其他內容進行「panic」的唯一方法。

另外,Rust 2021中的「core::panic!()」和「std::panic!()」將會是等效的。目前,這兩者之間存在一些差異,尤其是在開啟或關閉「#![no_std]」時 。

7.保留的語法

為了將來為某些新語法騰出空間,我們決定為字首的識別符號和文字保留語法:「prefix#identifier」,「prefix“string”」,「prefix‘c’」和「prefix#123」,其中「prefix」可以是任何識別符號(除了那些已經具有含義的,例如「b‘…’」和「r“…”」)。

這是一個重大變化,因為宏會接受「hello“world”」,並視其為兩個單獨的標記:「hello」和「“world”」。解決方法很簡單,只需插入一個空格:「hello “world”」

這些是可能會看到的一些新字首:

「f“”」是格式字串的簡寫形式。例如,「f“hello ”」是等效的「format_args!()」呼叫的簡寫形式。

「c“”」或「z“”」用於空終止的C字串。

「k#keyword」允許編寫當前版本中尚不存在的關鍵字。例如,雖然「async」在2015版中不是關鍵字,但是該字首將允許在2015版中以「k#async」作為替代。

8. 新的硬錯誤

在Rust 2021中,現有的兩個lint會被視為硬錯誤,在舊版本中,這些lint將仍然是警告。

「bare-trait-objects」:在Rust 2021中,必須使用「dyn」關鍵字標識特徵物件。

「ellipsis-inclusive-range-patterns」:Rust 2021不再接受過時的「。。。」語法,取而代之的是「。。 =」,不過表示式的使用是一樣的。

9. 「micro_rules」中的or

從1。53。0開始,便加入了對「|」的支援,使其可以巢狀在任何地方。例如,現在可以寫「Some(1 | 2)」,而不需要使用「Some(1) | Some(2)」這種方式。

這個改動會對「macro_rules」宏產生影響,於是在1。53。0中「:pat」並不與「|」相匹配。因為之前,並非在所有巢狀級別都可以包含「|」。

不過,在Rust 2021中,「:pat」片段說明符將匹配「A | B」。

由於有時仍然希望匹配不帶「|」的單個模式變數,因此添加了指定的片段「:pat_param」以保留舊的行為。

參考資料:

https://blog。rust-lang。org/2021/05/11/edition-2021。html

https://kaisery。github。io/trpl-zh-cn/ch00-00-introduction。html

https://www。oschina。net/news/141129/rust-1-52-1-released

https://www。oschina。net/news/141124/rust-2021-edition-plan

https://www。infoq。cn/article/19saqvrct5ym3jjbbsc8

https://www。reddit。com/r/rust/comments/n9z7lm/the_plan_for_the_rust_2021_edition/

AI家,新天地。西山新綠,新智元在等你!

辦公地址:北京海淀中關村軟體園3號樓1100