網(wǎng)站建設(shè)策目標(biāo)安卓?jī)?yōu)化大師全部版本
1.76.0
穩(wěn)定版
此版本較小
ABI
兼容更新
函數(shù)指針
文檔中新增的ABI
兼容部分介紹了函數(shù)簽名
與ABI
兼容的意義.大部分是參數(shù)類型
和返回類型
的兼容,及在當(dāng)前Rust
中兼容的列表
.文檔僅描述現(xiàn)有兼容的狀態(tài).
一個(gè)新增
功能是,現(xiàn)在保證符
和u32
是ABI
兼容的.它們一直有相同大小
和對(duì)齊方式
,但現(xiàn)在即使在調(diào)用函數(shù)的ABI
中,與上面文檔
一致,它們也是等價(jià)的.
引用中的類型名
為了調(diào)試,從Rust1.38
開始,就可用any::type_name::<T>()
返回T類型
的串描述
,但這需要一個(gè)顯式的類型參數(shù)
.
指定該類型
會(huì)有點(diǎn)難,尤其是對(duì)無(wú)法命名的類型
(如閉包)或不透明的返回類型
.
新的any::type_name_of_val(&T)
可從類型引用
中取描述性名字
.
fn get_iter() -> impl Iterator<Item = i32> {[1, 2, 3].into_iter()
}
fn main() {let iter = get_iter();let iter_name = std::any::type_name_of_val(&iter);let sum: i32 = iter.sum();println!("The sum of the `{iter_name}` is {sum}.");
}
當(dāng)前打印:
'core::array::iter::IntoIter<i32,3>'
的和是6
.
穩(wěn)定的API
Arc::unwrap_or_clone
Rc::unwrap_or_clone
Result::inspect
Result::inspect_err
Option::inspect
type_name_of_val
ptr::{from_ref, from_mut}
ptr::addr_eq
std::hash::{DefaultHasher,RandomState}
這些以前只能通過(guò)std::collections::hash_map
取得.
1.77.0
穩(wěn)定版
此版本較小
.
C串字面
Rust
現(xiàn)在支持在&'static CStr
內(nèi)存類型中,擴(kuò)展
到按nul
字節(jié)終止的串
的的C串字面
(c"abc"
).這樣更易編寫
與需要nul
結(jié)尾串的外部接口
互操作的代碼,并在編譯時(shí)
檢查所有相關(guān)的錯(cuò)誤
(如,缺少內(nèi)部nul
字節(jié)).
支持異步fn
中的遞歸
因?yàn)?code>編譯器限制,以前異步函數(shù)
無(wú)法調(diào)用自身
.在1.77
中,已取消該限制
,因此只要使用間接
以避免無(wú)窮大小
的函數(shù)狀態(tài)
,就允許遞歸調(diào)用
.
即像此代碼
現(xiàn)在可以工作
了:
async fn fib(n: u32) -> u32 {match n {0 | 1 => 1,_ => Box::pin(fib(n-1)).await + Box::pin(fib(n-2)).await}
}
offset_of!
對(duì)構(gòu)字段
,1.77.0
穩(wěn)定了可訪問(wèn)結(jié)構(gòu)
的相關(guān)公
字段的字節(jié)偏移
的offset_of!
.當(dāng)在沒有類型的現(xiàn)成實(shí)例
,但需要字段的偏移
時(shí),此宏
最有用.
用戶
現(xiàn)在可用offset_of!(StructName, field)
訪問(wèn)公
字段的偏移
,它從結(jié)構(gòu)開頭開始
按字節(jié)用偏移擴(kuò)展到usize
式.
默認(rèn),在發(fā)布配置文件中允許去掉
未在輸出中允許調(diào)試信息
的cargo
配置文件(如,debug=0
)默認(rèn)允許strip="debuginfo"
.
主要是因?yàn)?預(yù)編譯的
)標(biāo)準(zhǔn)庫(kù)
附帶了調(diào)試信息
,即即使本地編譯
沒有顯式
請(qǐng)求調(diào)試信息
,但靜態(tài)鏈接
的結(jié)果包含
了標(biāo)準(zhǔn)庫(kù)的調(diào)試信息
.
需要調(diào)試信息
的用戶可用相關(guān)Cargo
配置文件中的調(diào)試
標(biāo)志顯式允許它
.
Stabilized APIs
array::each_ref
array::each_mut
core::net
f32::round_ties_even
f64::round_ties_even
mem::offset_of!
slice::first_chunk
slice::first_chunk_mut
slice::split_first_chunk
slice::split_first_chunk_mut
slice::last_chunk
slice::last_chunk_mut
slice::split_last_chunk
slice::split_last_chunk_mut
slice::chunk_by
slice::chunk_by_mut
Bound::map
File::create_new
Mutex::clear_poison
RwLock::clear_poison
1.78.0
穩(wěn)定版
診斷屬性
Rust
現(xiàn)在支持#[diagnostic]
屬性名字空間
,來(lái)影響編譯器錯(cuò)誤消息
.按不要求編譯器
用的提示
對(duì)待這些,提供編譯器無(wú)法識(shí)別
的診斷
也不是錯(cuò)誤.
該靈活性
使得即使并非所有
,無(wú)論是不同版本
還是完全不同實(shí)現(xiàn)
的編譯器
,都支持它們
,源碼
提供診斷.
此名字空間
帶有第一個(gè)支持
的#[diagnostic::on_unimplemented]
屬性,需要該特征
但尚未在類型
上實(shí)現(xiàn)時(shí),可在特征
上放置
它以自定義消息
.
考慮穩(wěn)定化拉請(qǐng)
中給出的示例
:
#[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());
}
以前,編譯器會(huì)給出如下內(nèi)置錯(cuò)誤
:
錯(cuò)誤[E0277]
:不滿足'String:ImportantTrait<i32>'
的特征約束.
–>src/main.rs:12:18
|
12|use_my_trait(String::new());
|------------^^^^^^^^^^^^^未為'串'
實(shí)現(xiàn)'ImportantTrait<i32>'
特征
|此調(diào)用
引入的約束
的必需.
使用#[diagnostic::on_unimplemented]
,其自定義消息
填充主錯(cuò)誤行
,在源輸出
上放置其自定義標(biāo)簽
.仍按幫助輸出
寫入原標(biāo)簽
,且也會(huì)寫入自定義注解
.
這些確切細(xì)節(jié)
可能會(huì)變化.
錯(cuò)誤[E0277]
:未為'串'
實(shí)現(xiàn)'ImportantTrait<i32>'
的消息
–>src/main.rs:12:18
|
12|use_my_trait(String::new());
|------------^^^^^^^^^^^^^我的標(biāo)簽
|由此調(diào)用引入的約束
必需
=幫助
:未為'串'
實(shí)現(xiàn)'ImportantTrait<i32>'
特征
=注:注1
=注:注2
對(duì)特征
作者來(lái)說(shuō),如果可提供更好的提示
,而不僅是談?wù)?/code>缺失的實(shí)現(xiàn)自身,則
該診斷
會(huì)更有用
.如,這是標(biāo)準(zhǔn)
庫(kù)中的刪節(jié)示例
:
#[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 compiletime"
)]
pub trait Sized {}
斷定不安全的前提條件
Rust
標(biāo)準(zhǔn)庫(kù)有許多不安全
函數(shù)的前提條件
的斷定,但歷史上它們只在標(biāo)準(zhǔn)庫(kù)
的#[cfg(debug_assertions)]
構(gòu)建中允許,以避免影響發(fā)布性能
.
然而,因?yàn)橐话闶窃?code>發(fā)布模式下編譯和分發(fā)
的標(biāo)準(zhǔn)庫(kù)
,因此大多數(shù)Rust
開發(fā)者并不檢查這些
.
現(xiàn)在,延遲到生成代碼
,才執(zhí)行這些斷定的條件
,因此根據(jù)用戶自己的設(shè)置
來(lái)檢查調(diào)試斷定
,在調(diào)試和測(cè)試
構(gòu)建中默認(rèn)允許
.
盡管檢查
的量的細(xì)節(jié)一般不穩(wěn)定,此更改可幫助用戶在其代碼中抓未定義行為
.
如,slice::from_raw_parts
要求一個(gè)對(duì)齊
的非無(wú)效
指針.以下故意的未對(duì)齊指針
有未定義行為
,雖然如果你運(yùn)氣不佳
,在過(guò)去可能"有效
",但調(diào)試斷定
現(xiàn)在可以抓住它
:
fn main() {let slice: &[u8] = &[1, 2, 3, 4, 5];let ptr = slice.as_ptr();//從對(duì)齊總是與`'u16'`的正確方式相差1個(gè)的`'針'`創(chuàng)建一個(gè)偏移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);
}
在library/core/src/panicking.rs:220:5
處'main'
線程出現(xiàn)緊急情況
:
違反了不安全的前提條件
:slice::from_raw_parts
要求指針對(duì)齊
且非無(wú)效
,且切片的總大小
不超過(guò)'isize::MAX'
注意:使用'RUST_BACKTRACE=1'
環(huán)境變量運(yùn)行以顯示追蹤追蹤
線程
導(dǎo)致非展開崩潰
.中止.
確定性重新對(duì)齊
標(biāo)準(zhǔn)庫(kù)有一些可改變指針
和切片
的對(duì)齊方式
的函數(shù),但是如果嚴(yán)格遵守他們的文檔
,它們以前有一些注意,這樣,實(shí)際上難以依賴它們
.
這些警告
主要是為了對(duì)沖常
求值,但,它們只對(duì)非常
使用是穩(wěn)定
的.現(xiàn)在,他們承諾根據(jù)其實(shí)際輸入
,有一致的運(yùn)行時(shí)行為
.
pointer::align_offset
計(jì)算,要按給定對(duì)齊
更改指針需要的偏移
.如果不行,它會(huì)返回usize::MAX
,但以前允許總是返回usize::MAX
,現(xiàn)在已刪除該行為
.
slice::align_to
和slice::align_to_mut
都按對(duì)齊
的中間切片
和剩余的未對(duì)齊
的頭
和尾切片
轉(zhuǎn)換切片
.
這些方法
現(xiàn)在承諾返回盡量大的中間部分
,而不是允許實(shí)現(xiàn)返回次優(yōu)
的,如按頭片
返回所有內(nèi)容
.
穩(wěn)定的API
對(duì)多個(gè)std::error::Error
,接受相關(guān)實(shí)現(xiàn)
的非'static
生命期
impl Read for &Stdin
Makeimpl<Fd:AsFd>impltakeSized
implFrom<TryReserveError>forio::Error
這些API
現(xiàn)在在常
環(huán)境中是穩(wěn)定的:
Barrier::new()
兼容說(shuō)明
如前,Rust1.78
已要求其最低
提高到窗口10
,以實(shí)現(xiàn)以下目標(biāo)
:
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
Rust1.78
的LLVM
已升級(jí)到18
版本,完成了已聲明
的針對(duì)x86-32
和x86-64
目標(biāo)的u128/i128ABI
更改.
1.79.0
穩(wěn)定版
內(nèi)聯(lián)常
式
常{...}
塊現(xiàn)在在式位置
上是穩(wěn)定的,允許無(wú)需額外的聲明
(如,在特征
上定義常
項(xiàng)或關(guān)聯(lián)的常
)的,顯式進(jìn)入常
環(huán)境.
與常
項(xiàng)(const ITEM:...=...
)不同,內(nèi)聯(lián)常
可使用域內(nèi)的泛型
,并推導(dǎo)其類型
而不是顯式寫出來(lái)
,這樣,對(duì)內(nèi)聯(lián)代碼片
特別有用.如,像此模式:
const EMPTY: Option<Vec<u8>> = None;
let foo = [EMPTY; 100];
//可寫作:
let foo = [const { None }; 100];
注意,這也適合泛型環(huán)境
,以前要求帶關(guān)聯(lián)常
的冗長(zhǎng)特征
聲明:
fn create_none_array<T, const N: usize>() -> [Option<T>; N] {[const { None::<T> }; N]
}
這樣,代碼更加簡(jiǎn)潔并易于閱讀
.
關(guān)聯(lián)類型位置的約束
Rust1.79
穩(wěn)定了關(guān)聯(lián)項(xiàng)
的約束語(yǔ)法
,這允許在其他約束
內(nèi)的關(guān)聯(lián)類型位置
中放置約束
,即T:Trait<Assoc:Bounds...>
.
這樣就不需要顯式泛型類型
來(lái)約束關(guān)聯(lián)類型
.
此功能允許在一些以前不可能
或要施加額外,不必要
的限制的地方,指定約束
:
where
子句,在此,相當(dāng)于將約束
分割為兩個(gè)(或多個(gè))
,where
子句.
如,where T:Trait<Assoc:Bound>
等價(jià)于where T:Trait,<T as Trait>::Assoc:Bound
.
1,超級(jí)特征
,與where
子句不同,使用特征
時(shí),通過(guò)新語(yǔ)法
隱式指定約束
.示例語(yǔ)法
:
trait CopyIterator: Iterator<Item: Copy> {}
2,關(guān)聯(lián)類型項(xiàng)
約束,允許約束
與特征
的關(guān)聯(lián)類型
關(guān)聯(lián)的嵌套剛性投影
.如,
trait Trait { type Assoc: Trait2<Assoc2: Copy>; }
3,不透明類型約束
(RPIT,TAIT
),允許無(wú)需命名不透明類型
,約束與不透明類型
關(guān)聯(lián)的關(guān)聯(lián)類型
.如,impl Iterator<Item:Copy>
定義一個(gè)項(xiàng)
為復(fù)制
的迭代器
,不必實(shí)際將該項(xiàng)
叫約束
.
擴(kuò)展自動(dòng)臨時(shí)生命期
現(xiàn)在在匹配
和如
構(gòu)造中,自動(dòng)擴(kuò)展
在構(gòu)造
中立即引用
的臨時(shí)
的生命期.這與塊結(jié)構(gòu)
中擴(kuò)展臨時(shí)對(duì)象的生命期
一樣.
如:
let a = if true {..;&temp() //過(guò)去錯(cuò)誤,但現(xiàn)在擴(kuò)展了生命期
} else {..;&temp() //過(guò)去錯(cuò)誤,但現(xiàn)在擴(kuò)展了生命期
};
//而
let a = match () {_ => {..;&temp() //過(guò)去錯(cuò)誤,但現(xiàn)在擴(kuò)展了生命期}
};
現(xiàn)在與之前行為
一致:
let a = {..;&temp() //擴(kuò)展生命期
};
因?yàn)檫@些程序過(guò)去編譯失敗
,此行為后向兼容
.
在標(biāo)準(zhǔn)庫(kù)構(gòu)建中允許幀指針
標(biāo)準(zhǔn)庫(kù)
現(xiàn)在使用-Cforce-frame-pointers=yes
編譯分發(fā)Rust
項(xiàng),使下游用戶可更輕松地分析他們的程序
.注意,盡管在Cargo
的發(fā)布配置文件
中默認(rèn)去掉它
,標(biāo)準(zhǔn)庫(kù)還繼續(xù)提供了行級(jí)調(diào)試信息
(如,DWARF
).
穩(wěn)定的API
{integer}::unchecked_add
{integer}::unchecked_mul
{integer}::unchecked_sub
<[T]>::split_at_unchecked
<[T]>::split_at_mut_unchecked
<[u8]>::utf8_chunks
str::Utf8Chunks
str::Utf8Chunk
<*const T>::is_aligned
<*mut T>::is_aligned
NonNull::is_aligned
<*const [T]>::len
<*mut [T]>::len
<*const [T]>::is_empty
<*mut [T]>::is_empty
NonNull::<[T]>::is_empty
CStr::count_bytes
io::Error::downcast
num::NonZero<T>
path::absolute
proc_macro::Literal::byte_character
proc_macro::Literal::c_string
這些API
現(xiàn)在在常
環(huán)境中是穩(wěn)定
的:
Atomic*::into_inner
io::Cursor::new
io::Cursor::get_ref
io::Cursor::position
io::empty
io::repeat
io::sink
panic::Location::caller
panic::Location::file
panic::Location::line
panic::Location::column