Rust 1.79.0釋出 ,此版本中的一些主要新功能和改進:
內聯 const 表示式
內聯表示式(例如塊)現在在表示式位置上是穩定的,允許顯式輸入 const 上下文而無需額外宣告。這使得涉及常量的程式碼更加簡潔和可讀,尤其是在通用上下文中。
以前:
const EMPTY: Option<Vec<u8>> = None; |
現在:
let foo = [const { None }; 100]; |
值得注意的是,這對於通用上下文也是如此,以前需要使用關聯常量的詳細特徵宣告:
fn create_none_array<T, const N: usize>() -> [Option<T>; N] { |
這使得程式碼更加簡潔,更易於閱讀。
關聯型別位置的Bound
Rust 1.79 穩定了在其他特徵bound邊界內直接指定關聯型別邊界bound的能力:
T: Trait<Assoc: Bounds...>
例如。這樣就避免了僅僅為了約束關聯型別而需要額外的泛型型別。
這一功能允許在一些地方指定界限,而在以前,這些地方要麼是不可能的,要麼是對使用施加了額外的、不必要的限制:
where 子句
在這個位置上,相當於將邊界分成兩個(或多個)where 子句。
例如,
where T:Trait<Assoc: Bound> |
相當於
where T:Trait, <T as Trait>::Assoc: Bound |
Supertraits
與 where 子句不同,在使用trait 時,透過新語法指定的約束是隱含的。
語法示例:
trait CopyIterator: Iterator<Item: Copy> {}. |
關聯型別項邊界(Associated type item bounds)
這允許對與 trait 關聯型別相關聯的巢狀剛性投影進行約束,例如
trait Trait { type Assoc: Trait2<Assoc2: Copy>; } |
不透明型別邊界(RPIT、TAIT)
可以約束與不透明型別相關聯的關聯型別,而無需命名不透明型別。例如, impl Iterator<Item:Copy> 定義了一個迭代器,它的項是 Copy,而無需實際命名該項繫結。
延長自動臨時壽命延長
在構造中被立即引用的暫時項現在會在match 和 if 構造中自動進行生命週期擴充套件。這與塊構造中暫時項的生命週期擴充套件行為相同。
if 構造
let a = if true { |
match構造
let a = match () { |
現在
let a = { |
這種行為是向後相容的,因為以前這些程式會出現編譯失敗。
為標準庫啟用框架指標
標準庫現在預設編譯時啟用了框架指標,從而可以更輕鬆地分析使用它的程式。
Rust 專案釋出的標準庫現在在編譯時使用了 -Cforce-frame-pointers=yes,這樣下游使用者就能更輕鬆地配置自己的程式。需要注意的是,標準庫還會繼續提供行級除錯資訊(如 DWARF),不過 Cargo 釋出的配置檔案預設會刪除這些資訊。