Rust 1.79.0釋出

banq發表於2024-06-15


Rust 1.79.0釋出 ,此版本中的一些主要新功能和改進:

內聯 const 表示式
內聯表示式(例如塊)現在在表示式位置上是穩定的,允許顯式輸入 const 上下文而無需額外宣告。這使得涉及常量的程式碼更加簡潔和可讀,尤其是在通用上下文中。

以前:

const EMPTY: Option<Vec<u8>> = None;
let foo = [EMPTY; 100];

現在:

let foo = [const { None }; 100];

值得注意的是,這對於通用上下文也是如此,以前需要使用關聯常量的詳細特徵宣告:

fn create_none_array<T, const N: usize>() -> [Option<T>; N] {
    [const { None::<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 {
    ..;
    &temp() // used to error, but now gets lifetime extended
} else {
    ..;
    &temp() // used to error, but now gets lifetime extended
};

match構造

let a = match () {
    _ => {
        ..;
        &temp() // used to error, but now gets lifetime extended
    }
};

現在

let a = {
    ..;
    &temp() // lifetime is extended
};

這種行為是向後相容的,因為以前這些程式會出現編譯失敗。

為標準庫啟用框架指標
標準庫現在預設編譯時啟用了框架指標,從而可以更輕鬆地分析使用它的程式。

Rust 專案釋出的標準庫現在在編譯時使用了 -Cforce-frame-pointers=yes,這樣下游使用者就能更輕鬆地配置自己的程式。需要注意的是,標準庫還會繼續提供行級除錯資訊(如 DWARF),不過 Cargo 釋出的配置檔案預設會刪除這些資訊。


 

相關文章