#[diagnostic::do_not_recommend]
unpredictable_function_pointer_comparisons
lint 以警告函数指针比较#[no_mangle]
和 #[export_name]
属性进行 Lint。-Zpolymorphize
已被移除,请参阅 https://github.com/rust-lang/compiler-team/issues/810 了解一些背景信息。请参阅 Rust 的 平台支持页面 了解有关 Rust 分层平台支持的更多信息。
Windows 上的 std::env::home_dir()
现在忽略非标准的 $HOME
环境变量
它将在后续版本中取消弃用。
BuildHasherDefault::new
ptr::fn_addr_eq
io::ErrorKind::QuotaExceeded
io::ErrorKind::CrossesDevices
{float}::midpoint
{integer}::midpoint
NonZeroU*::midpoint
std::iter::Extend
FromIterator<(A, ...)>
std::task::Waker::noop
这些 API 现在在 const 上下文中是稳定的
mem::size_of_val
mem::align_of_val
Layout::for_value
Layout::align_to
Layout::pad_to_align
Layout::extend
Layout::array
std::mem::swap
std::ptr::swap
NonNull::new
HashMap::with_hasher
HashSet::with_hasher
BuildHasherDefault::new
<float>::recip
<float>::to_degrees
<float>::to_radians
<float>::max
<float>::min
<float>::clamp
<float>::abs
<float>::signum
<float>::copysign
MaybeUninit::write
rustc
不再将 test
cfg 视为众所周知的 check-cfg,而是由构建系统和 --check-cfg
的用户1 使用 --check-cfg=cfg(test)
将其设置为众所周知的 cfg。
这样做是为了使像 Cargo 这样的构建系统能够有条件地设置它,因为并非所有源文件都适合单元测试。 Cargo(目前)无条件地将 test
cfg 设置为众所周知的 cfg。
std::env::home_dir()
已被弃用多年,因为它在某些 Windows 配置中,如果设置了 HOME
环境变量(这在 Windows 上不是正常配置),则可能会给出令人惊讶的结果。我们之前一直避免更改其行为,担心与依赖于此非标准配置的代码兼容。鉴于此函数已被弃用已久,我们现在将其行为修复为错误修复。后续版本将取消此函数的弃用。
使 core::ffi::c_char
的有符号性更紧密地匹配平台默认的 char
这在许多 Tier 2 和 Tier 3 目标(主要是 Arm 和 RISC-V 嵌入式目标)上将 c_char
从 i8
更改为 u8
或反之亦然。新的定义可能会导致编译失败,但修复了与 C 的兼容性问题。
libc
crate 自 0.2.169 版本起与此更改相匹配。
从外部 crate 编译嵌套的 macro_rules
宏时,内部 macro_rules
的内容现在使用外部 crate 的 edition 构建,而不是本地 crate。
将 sparcv9-sun-solaris
和 x86_64-pc-solaris
Solaris 基线提高到 11.4。
这些更改不影响 Rust 的任何公共接口,但它们代表了对 rustc 和相关工具的性能或内部结构的重大改进。
#[forbid]
内部使用 #[deny]
作为空操作-Ctarget-feature
切换可能由于 ABI 不匹配而导致不健全的功能时,显示警告/
作为 include!()
的路径分隔符*ptr
) 的原始引用 (raw (const|mut)
) 现在是安全的extern "C"
函数中展开时执行 drop glue--print host-tuple
标志以打印主机目标元组,并确认 “target tuple” 术语优于 “target triple”loongarch64-unknown-linux-{musl,ohos}
设置对外部数据的间接访问unexpected_cfgs
lint 以在外部宏中也发出警告multivalue
、reference-types
和 tail-call
目标功能wasm32v1-none
目标添加 Tier 2 支持Box/Rc/Arc<{slice}>
实现 From<&mut {slice}>
<float>::copysign
、<float>::abs
、<float>::signum
移动到 core
NonZero
添加 LowerExp
和 UpperExp
实现CString
实现 FromStr
,为 String
实现 TryFrom<CString>
std::os::darwin
已公开Ipv6Addr::is_unique_local
Ipv6Addr::is_unicast_link_local
core::ptr::with_exposed_provenance
core::ptr::with_exposed_provenance_mut
<ptr>::addr
<ptr>::expose_provenance
<ptr>::with_addr
<ptr>::map_addr
<int>::isqrt
<int>::checked_isqrt
<uint>::isqrt
NonZero::isqrt
core::ptr::without_provenance
core::ptr::without_provenance_mut
core::ptr::dangling
core::ptr::dangling_mut
Pin::as_deref_mut
这些 API 现在在 const 上下文中是稳定的
AtomicBool::from_ptr
AtomicPtr::from_ptr
AtomicU8::from_ptr
AtomicU16::from_ptr
AtomicU32::from_ptr
AtomicU64::from_ptr
AtomicUsize::from_ptr
AtomicI8::from_ptr
AtomicI16::from_ptr
AtomicI32::from_ptr
AtomicI64::from_ptr
AtomicIsize::from_ptr
<ptr>::is_null
<ptr>::as_ref
<ptr>::as_mut
Pin::new
Pin::new_unchecked
Pin::get_ref
Pin::into_ref
Pin::get_mut
Pin::get_unchecked_mut
Pin::static_ref
Pin::static_mut
LSX
目标功能-Zprofile
标志(“gcov 风格” 覆盖率检测)已被移除。 这不影响覆盖率检测的稳定标志 (-Cinstrument-coverage
) 和 profile-guided optimization (-Cprofile-generate
, -Cprofile-use
),它们是不相关的并且仍然可用。wasm32-wasi
的目标的支持已被移除,因为该目标现在名为 wasm32-wasip1
。这完成了 过渡 计划,该计划遵循了 Rust 1.78 中 wasm32-wasip1
的引入。Rust 1.81 中 使用 wasm32-wasi
时引入的编译器警告现在也已消失,因为该目标已被移除。&pin (mut|const) T
现在被解析为一种类型,理论上可能会影响某些极端情况下的宏展开结果std::arch
函数的旧语法不再允许声明项或主体(例如闭包、内联常量或 async 块)。&mut
、*mut
、&Cell
和 *const Cell
。const
初始化器中创建对 statics 的引用。'r#ident
)。!
类型的位置进行隐式强制转换const extern
函数现在可以为其他调用约定定义。expr_2021
宏片段说明符。non_local_definitions
lint 现在在更少的代码上触发,并默认发出警告。-Csoft-float
标志。请参阅 Rust 的 平台支持页面 了解有关 Rust 分层平台支持的更多信息。
ExitCode
实现 PartialEq
。catch_unwind
可以处理外部异常而不会导致 UB,尽管确切行为未指定。HashMap
/HashSet
迭代器实现 Default
。ptr::add
/sub
的文档,使其不再声称与 offset
等效。BufRead::skip_until
ControlFlow::break_value
ControlFlow::continue_value
ControlFlow::map_break
ControlFlow::map_continue
DebugList::finish_non_exhaustive
DebugMap::finish_non_exhaustive
DebugSet::finish_non_exhaustive
DebugTuple::finish_non_exhaustive
ErrorKind::ArgumentListTooLong
ErrorKind::Deadlock
ErrorKind::DirectoryNotEmpty
ErrorKind::ExecutableFileBusy
ErrorKind::FileTooLarge
ErrorKind::HostUnreachable
ErrorKind::IsADirectory
ErrorKind::NetworkDown
ErrorKind::NetworkUnreachable
ErrorKind::NotADirectory
ErrorKind::NotSeekable
ErrorKind::ReadOnlyFilesystem
ErrorKind::ResourceBusy
ErrorKind::StaleNetworkFileHandle
ErrorKind::StorageFull
ErrorKind::TooManyLinks
Option::get_or_insert_default
Waker::data
Waker::new
Waker::vtable
char::MIN
hash_map::Entry::insert_entry
hash_map::VacantEntry::insert_entry
这些 API 现在在 const 上下文中是稳定的
Cell::into_inner
Duration::as_secs_f32
Duration::as_secs_f64
Duration::div_duration_f32
Duration::div_duration_f64
MaybeUninit::as_mut_ptr
NonNull::as_mut
NonNull::copy_from
NonNull::copy_from_nonoverlapping
NonNull::copy_to
NonNull::copy_to_nonoverlapping
NonNull::slice_from_raw_parts
NonNull::write
NonNull::write_bytes
NonNull::write_unaligned
OnceCell::into_inner
Option::as_mut
Option::expect
Option::replace
Option::take
Option::unwrap
Option::unwrap_unchecked
Option::<&_>::copied
Option::<&mut _>::copied
Option::<Option<_>>::flatten
Option::<Result<_, _>>::transpose
RefCell::into_inner
Result::as_mut
Result::<&_, _>::copied
Result::<&mut _, _>::copied
Result::<Option<_>, _>::transpose
UnsafeCell::get_mut
UnsafeCell::into_inner
array::from_mut
char::encode_utf8
{float}::classify
{float}::is_finite
{float}::is_infinite
{float}::is_nan
{float}::is_normal
{float}::is_sign_negative
{float}::is_sign_positive
{float}::is_subnormal
{float}::from_bits
{float}::from_be_bytes
{float}::from_le_bytes
{float}::from_ne_bytes
{float}::to_bits
{float}::to_be_bytes
{float}::to_le_bytes
{float}::to_ne_bytes
mem::replace
ptr::replace
ptr::slice_from_raw_parts_mut
ptr::write
ptr::write_unaligned
<*const _>::copy_to
<*const _>::copy_to_nonoverlapping
<*mut _>::copy_from
<*mut _>::copy_from_nonoverlapping
<*mut _>::copy_to
<*mut _>::copy_to_nonoverlapping
<*mut _>::write
<*mut _>::write_bytes
<*mut _>::write_unaligned
slice::from_mut
slice::from_raw_parts_mut
<[_]>::first_mut
<[_]>::last_mut
<[_]>::first_chunk_mut
<[_]>::last_chunk_mut
<[_]>::split_at_mut
<[_]>::split_at_mut_checked
<[_]>::split_at_mut_unchecked
<[_]>::split_first_mut
<[_]>::split_last_mut
<[_]>::split_first_chunk_mut
<[_]>::split_last_chunk_mut
str::as_bytes_mut
str::as_mut_ptr
str::from_utf8_unchecked_mut
CARGO_MANIFEST_PATH
环境变量,类似于 CARGO_MANIFEST_DIR
,但直接指向 manifest 文件。package.autolib
,允许禁用 [lib]
自动发现。# headers
。这类似于 rustdoc-search-enhancements 浏览器扩展提供的第三方功能。检查 fn 指针转换中源类型签名的良好性。 这部分地弥补了将函数项转换为函数指针时出现的健全性漏洞
macOS 上的链接现在正确包含 Rust 的默认部署目标。由于链接器错误,您可能需要传递 MACOSX_DEPLOYMENT_TARGET
或修复您的 #[link]
属性以指向正确的框架。请参阅 https://github.com/rust-lang/rust/pull/129369。
Rust 现在会为在非 struct
/enum
/union
项上编写的 repr(Rust)
正确引发错误,因为它之前没有任何效果。
未来的不兼容 lint deprecated_cfg_attr_crate_type_name
已被制成硬错误。它用于拒绝在 #![cfg_attr]
中使用 #![crate_type]
和 #![crate_name]
属性,这需要在编译器中进行 hack 才能在 cfg 扩展后更改使用的 crate 类型和 crate 名称。当在命令行上运行 rustc
/cargo rustc
时,用户可以使用 --crate-type
代替 #![cfg_attr(..., crate_type = "...")]
,使用 --crate-name
代替 #![cfg_attr(..., crate_name = "...")]
。在 #![cfg_attr]
之外使用这两个属性继续得到完全支持。
到目前为止,sysroot 中的路径在诊断、codegen、回溯中始终以 /rustc/$hash
为前缀,例如。
thread 'main' panicked at 'hello world', map-panic.rs:2:50
stack backtrace:
0: std::panicking::begin_panic
at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/std/src/panicking.rs:616:12
1: map_panic::main::{{closure}}
at ./map-panic.rs:2:50
2: core::option::Option<T>::map
at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/core/src/option.rs:929:29
3: map_panic::main
at ./map-panic.rs:2:30
4: core::ops::function::FnOnce::call_once
at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/core/src/ops/function.rs:248:5
note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace.
我们希望更改此行为,以便当可以发现
rust-src
源文件时,虚拟路径被丢弃,因此将嵌入本地路径,除非存在--remap-path-prefix
导致此本地路径以通常的方式重新映射。
#129687 实现了此行为,当 rust-src
在编译时存在时,rustc
会尽最大努力将 /rustc/$hash
替换为本地 rust-src
组件中的真实路径。为了清理这一点,用户必须显式提供 --remap-path-prefix=<path to rust-src>=foo
或不安装 rust-src
组件。
默认允许的 missing_docs
lint 过去在通过 rustc --test
/cargo test
调用时会禁用自身,导致 #[expect(missing_docs)]
发出误报,因为期望被错误地未满足。 此行为现已被移除,这允许 #[expect(missing_docs)]
在所有场景中得到满足,但也会为公开可访问的 #[cfg(test)]
项、集成测试 crate 级别文档以及集成测试中公开可访问的项报告新的 missing_docs
诊断。
修复了一个健全性错误,其中 rustc 在 dyn Trait
的关联类型中未检测到由于 supertraits 引起的未约束的高阶生命周期。
删除 aarch64-fuchsia
和 x86_64-fuchsia
目标别名,以支持 aarch64-unknown-fuchsia
和 x86_64-unknown-fuchsia
。
addr_of(_mut)!
宏和新稳定的 &raw (const|mut)
现在可以安全地与所有静态项一起使用for<...>
binder 之后,重新排序 trait bound 修饰符+ use<'lt>
不透明类型精确捕获 (RFC 3617)&raw const
和 &raw mut
运算符 (RFC 2582)offset_of!
中的嵌套字段访问[T; 0]
时,不需要 T
处于 live 状态const
操作数const fn
中稳定浮点算术aarch64-apple-ios-macabi
和 x86_64-apple-ios-macabi
提升到 Tier 2,并随 rustup 一起发布-> !
的 async 函数正确触发 unreachable code 警告aarch64-apple-darwin
提升到 Tier 1aarch64-unknown-trusty
和 armv7-unknown-trusty
添加为 tier 3 目标wasm32-wasip2
提升到 Tier 2。std::thread::Builder::spawn_unchecked
std::str::CharIndices::offset
std::option::Option::is_none_or
[T]::is_sorted
[T]::is_sorted_by
[T]::is_sorted_by_key
Iterator::is_sorted
Iterator::is_sorted_by
Iterator::is_sorted_by_key
std::future::Ready::into_inner
std::iter::repeat_n
impl<T: Clone> DoubleEndedIterator for Take<Repeat<T>>
impl<T: Clone> ExactSizeIterator for Take<Repeat<T>>
impl<T: Clone> ExactSizeIterator for Take<RepeatWith<T>>
impl Default for std::collections::binary_heap::Iter
impl Default for std::collections::btree_map::RangeMut
impl Default for std::collections::btree_map::ValuesMut
impl Default for std::collections::vec_deque::Iter
impl Default for std::collections::vec_deque::IterMut
Rc<T>::new_uninit
Rc<MaybeUninit<T>>::assume_init
Rc<[T]>::new_uninit_slice
Rc<[MaybeUninit<T>]>::assume_init
Arc<T>::new_uninit
Arc<MaybeUninit<T>>::assume_init
Arc<[T]>::new_uninit_slice
Arc<[MaybeUninit<T>]>::assume_init
Box<T>::new_uninit
Box<MaybeUninit<T>>::assume_init
Box<[T]>::new_uninit_slice
Box<[MaybeUninit<T>]>::assume_init
core::arch::x86_64::_bextri_u64
core::arch::x86_64::_bextri_u32
core::arch::x86::_mm_broadcastsi128_si256
core::arch::x86::_mm256_stream_load_si256
core::arch::x86::_tzcnt_u16
core::arch::x86::_mm_extracti_si64
core::arch::x86::_mm_inserti_si64
core::arch::x86::_mm_storeu_si16
core::arch::x86::_mm_storeu_si32
core::arch::x86::_mm_storeu_si64
core::arch::x86::_mm_loadu_si16
core::arch::x86::_mm_loadu_si32
core::arch::wasm32::u8x16_relaxed_swizzle
core::arch::wasm32::i8x16_relaxed_swizzle
core::arch::wasm32::i32x4_relaxed_trunc_f32x4
core::arch::wasm32::u32x4_relaxed_trunc_f32x4
core::arch::wasm32::i32x4_relaxed_trunc_f64x2_zero
core::arch::wasm32::u32x4_relaxed_trunc_f64x2_zero
core::arch::wasm32::f32x4_relaxed_madd
core::arch::wasm32::f32x4_relaxed_nmadd
core::arch::wasm32::f64x2_relaxed_madd
core::arch::wasm32::f64x2_relaxed_nmadd
core::arch::wasm32::i8x16_relaxed_laneselect
core::arch::wasm32::u8x16_relaxed_laneselect
core::arch::wasm32::i16x8_relaxed_laneselect
core::arch::wasm32::u16x8_relaxed_laneselect
core::arch::wasm32::i32x4_relaxed_laneselect
core::arch::wasm32::u32x4_relaxed_laneselect
core::arch::wasm32::i64x2_relaxed_laneselect
core::arch::wasm32::u64x2_relaxed_laneselect
core::arch::wasm32::f32x4_relaxed_min
core::arch::wasm32::f32x4_relaxed_max
core::arch::wasm32::f64x2_relaxed_min
core::arch::wasm32::f64x2_relaxed_max
core::arch::wasm32::i16x8_relaxed_q15mulr
core::arch::wasm32::u16x8_relaxed_q15mulr
core::arch::wasm32::i16x8_relaxed_dot_i8x16_i7x16
core::arch::wasm32::u16x8_relaxed_dot_i8x16_i7x16
core::arch::wasm32::i32x4_relaxed_dot_i8x16_i7x16_add
core::arch::wasm32::u32x4_relaxed_dot_i8x16_i7x16_add
这些 API 现在在 const 上下文中是稳定的
std::task::Waker::from_raw
std::task::Context::from_waker
std::task::Context::waker
{integer}::from_str_radix
std::num::ParseIntError::kind
explicit_builtin_cfgs_in_flags
lint,以防止不连贯的状态,例如 windows cfg 处于活动状态,但目标是基于 Linux 的。应使用适当的 rustc
标志 代替。binary_search
实现,它显着提高了性能 (#128254)。但是,当排序切片具有多个比较相等的值时,新实现可能会在相等的值中选择与旧实现不同的值。MSG_NOSIGNAL
。这避免了在写入已关闭的套接字时使用 SIGPIPE 终止进程,这与其他 UNIX 目标上的现有行为相匹配。--whole-archive
链接器标志,这可能会导致意外依赖它的代码出现链接器错误。multivalue
和 reference-types
现在都默认启用。这两个功能都对生成的 WebAssembly 二进制文件有细微的更改。对于 multivalue
功能,升级到 LLVM 19 后,WebAssembly 目标支持已更改。对生成具有多个返回值的函数不再有效,并且 -Ctarget-feature=+multivalue
的含义与 LLVM 18 及更早版本中的含义不同。不再有任何受支持的方法可以从 Rust 源代码生成具有 WebAssembly 中具有多个返回值的函数的模块。对于 reference-types
功能,call_indirect
中立即数的编码(WebAssembly 后端常用的指令)已更改。不了解 reference-types
提案的验证器和解析器将不再接受 LLVM 生成的模块,因为立即数的编码发生了更改。此外,这些已启用的功能被编码在 target_features
自定义部分中,可能会影响下游工具(例如 wasm-opt
)使用模块。生成禁用默认功能的 WebAssembly 模块需要 Cargo 的 -Zbuild-std
支持,更多信息可以在 rust-lang/rust#128511 中找到。这些更改不影响 Rust 的任何公共接口,但它们代表了对 rustc 和相关工具的性能或内部结构的重大改进。
extern "C"
函数中对未捕获的 panic 中止。&
的歧义情况。#[expect]
(RFC 2383), 类似于 #[allow]
,但如果 lint 未 满足,则发出警告。elided_lifetimes_in_associated_constant
提升为 deny。offset_from
: 始终允许指针指向同一地址。-Cinline-threshold=...
。transmute
大小检查中正确考虑对齐。box_pointers
lint。no_std
Xtensa 目标: xtensa-esp32-none-elf
、xtensa-esp32s2-none-elf
、xtensa-esp32s3-none-elf
std
Xtensa 目标: xtensa-esp32-espidf
、xtensa-esp32s2-espidf
、xtensa-esp32s3-espidf
i686-unknown-redox
arm64ec-pc-windows-msvc
提升到 Tier 2。loongarch64-unknown-linux-musl
提升到带有主机工具的 Tier 2。wasm32-wasi
。(请参阅下面的兼容性说明)PanicInfo
和 std 的 PanicInfo
。(请参阅下面的兼容性说明){Rc,Arc}::make_mut()
推广到 unsized 类型。driftsort
和不稳定的 ipnsort
替换排序实现。 所有 slice::sort*
和 slice::select_nth*
方法预计都会看到显着的性能提升。有关更多详细信息,请参阅 研究项目。create_dir_all
关于空路径的行为。Command
的批处理文件参数转义在文件名具有尾随空格或句点时不工作的问题 (CVE-2024-43402)。core::error
hint::assert_unchecked
fs::exists
AtomicBool::fetch_not
Duration::abs_diff
IoSlice::advance
IoSlice::advance_slices
IoSliceMut::advance
IoSliceMut::advance_slices
PanicHookInfo
PanicInfo::message
PanicMessage
这些 API 现在在 const 上下文中是稳定的
.cargo_vcs_info.json
始终包含在内,即使传递了 --allow-dirty
。package.license-file
和 package.readme
指向打包期间不存在的文件。--release
/--debug
标志以及 --profile
标志。Cargo.toml
中的 lib.plugin
键支持。Rust 插件支持已弃用四年,并在 1.75.0 中移除。使用 wasm32-wasi
目标现在将发出编译器警告,并请求用户切换到 wasm32-wasip1
目标。这两个目标是相同的,wasm32-wasi
只是被重命名,并且正在进行 对 WASI 目标的此更改,以便在 2025 年 1 月移除 wasm32-wasi
。
我们已将 std::panic::PanicInfo
重命名为 std::panic::PanicHookInfo
。旧名称将继续作为别名工作,但从 Rust 1.82.0 开始将产生弃用警告。
core::panic::PanicInfo
将保持不变,然而,因为它现在是一个不同的类型。
原因是这些类型具有不同的角色:std::panic::PanicHookInfo
是 std 上下文(panic 可以有任意 payload)中 panic hook 的参数,而 core::panic::PanicInfo
是 no_std 上下文(panic 总是携带格式化的消息)中 #[panic_handler]
的参数。分离这些类型使我们能够向这些类型添加更有用的方法,例如 std::panic::PanicHookInfo::payload_as_str()
和 core::panic::PanicInfo::message()
。
如果类型的 Ord
实现(或给定的比较函数)未实现 trait 要求的 全序,则新的排序实现可能会 panic。Ord
的 supertrait(PartialOrd
、Eq
和 PartialEq
)也必须保持一致。之前的实现不会“注意到”任何问题,但新的实现很有可能检测到不一致性,抛出 panic 而不是返回已知未排序的数据。
这些更改不影响 Rust 的任何公共接口,但它们代表了对 rustc 和相关工具的性能或内部结构的重大改进。
exclusive_range_pattern
功能Result
的布局和 ABIrepr(packed(1))
的类型上重新排序字段for_loops_over_fallibles
lint 以 lint 引用背后的 fallibles。-fuse-ld=lld
的 CC 上重试链接,但不使用 -fuse-ld=lld
...
) 解析为 trait bounds 中的类型-fuse-ld=lld
foo.into_iter()
解析为 &Box<[T]>: IntoIterator
size_of
和 size_of_val
以及 align_of
和 align_of_val
添加到 preludePathBuf::set_extension
会添加路径分隔符,则 panicc_char
以使用正确的类型offset_of!
不再返回临时值str.to_lowercase
中的 sigmaDEFAULT_MIN_STACK_SIZE
提升至至少 64KiBimpl Default for Rc<CStr>
impl Default for Rc<str>
impl Default for Rc<[T]>
impl Default for Arc<str>
impl Default for Arc<CStr>
impl Default for Arc<[T]>
impl IntoIterator for Box<[T]>
impl FromIterator<String> for Box<str>
impl FromIterator<char> for Box<str>
LazyCell
LazyLock
Duration::div_duration_f32
Duration::div_duration_f64
Option::take_if
Seek::seek_relative
BinaryHeap::as_slice
NonNull::offset
NonNull::byte_offset
NonNull::add
NonNull::byte_add
NonNull::sub
NonNull::byte_sub
NonNull::offset_from
NonNull::byte_offset_from
NonNull::read
NonNull::read_volatile
NonNull::read_unaligned
NonNull::write
NonNull::write_volatile
NonNull::write_unaligned
NonNull::write_bytes
NonNull::copy_to
NonNull::copy_to_nonoverlapping
NonNull::copy_from
NonNull::copy_from_nonoverlapping
NonNull::replace
NonNull::swap
NonNull::drop_in_place
NonNull::align_offset
<[T]>::split_at_checked
<[T]>::split_at_mut_checked
str::split_at_checked
str::split_at_mut_checked
str::trim_ascii
str::trim_ascii_start
str::trim_ascii_end
<[u8]>::trim_ascii
<[u8]>::trim_ascii_start
<[u8]>::trim_ascii_end
Ipv4Addr::BITS
Ipv4Addr::to_bits
Ipv4Addr::from_bits
Ipv6Addr::BITS
Ipv6Addr::to_bits
Ipv6Addr::from_bits
Vec::<[T; N]>::into_flattened
<[[T; N]]>::as_flattened
<[[T; N]]>::as_flattened_mut
这些 API 现在在 const 上下文中是稳定的
-Zcheck-cfg
为始终启用unexpected_cfgs
lint 添加特殊的 check-cfg
lint 配置cargo update --precise <yanked>
cargo add
时,不要更改 Cargo.toml
的文件权限cargo fix
-
从 stdin 读取std::env::{set_var, remove_var}
不再可以转换为安全函数指针,也不再实现 Fn
系列 traitSelf
构造函数时发出警告(或错误)indirect_structural_match
和 pointer_structural_match
lint 转换为硬错误where_clause_object_safety
lint 设为常规对象安全违规proc_macro_back_compat
lint 转换为硬错误。std::sync::ReentrantLockGuard<T>
如果 T: !Sync
则不再是 Sync
,这意味着 std::io::StdoutLock
和 std::io::StderrLock
不再是 SyncFromIterator for Box<str>
的新实现,类型推断在某些情况下会失败。 值得注意的是,这破坏了 0.3.35 之前的 time
crate 版本,原因是不再推断 Box<[_]>
的实现。这些更改不影响 Rust 的任何公共接口,但它们代表了对 rustc 和相关工具的性能或内部结构的重大改进。
const {}
表达式。redundant_lifetimes
lint 以检测语义上冗余的生命周期。unnameable_types
lint。-C collapse-macro-debuginfo
和 #[collapse_debuginfo]
。if
和 match
表达式中。const fn
调用的提升。refining_impl_trait
lint 细化 crate 私有 trait 的 impl。main
。impl Trait
生命周期推断-C strip
为仅影响二进制文件,而不影响 .pdb
等工件。-Crelro-level
以控制运行时链接强化。--check-cfg
在编译时检查 cfg
名称和值。 请注意,这仅稳定化了编译器部分,Cargo 部分在此版本中仍不稳定。aarch64-apple-visionos
和 aarch64-apple-visionos-sim
tier 3 目标。riscv32ima-unknown-none-elf
tier 3 目标。aarch64-pc-windows-gnullvm
、i686-pc-windows-gnullvm
和 x86_64-pc-windows-gnullvm
。请参阅 Rust 的 平台支持页面 了解有关 Rust 分层平台支持的更多信息。
(impl Default + Extend, impl Default + Extend)
实现 FromIterator
。X
上实现 {Div,Rem}Assign<NonZero<X>>
。clone_from()
的覆盖。transmute
。{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 现在在 const 上下文中是稳定的
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
RustcEncodable
和 RustcDecodable
被软弃用,将在下一个版本中从 prelude 中删除。wasm_c_abi
未来不兼容性 lint 将警告使用不符合规范的 C ABI。 使用 wasm-bindgen v0.2.88
生成向前兼容的绑定。#[cfg(target_abi = ...)]
#[diagnostic]
命名空间和 #[diagnostic::on_unimplemented]
属性illegal_floating_point_literal_pattern
的其余部分invalid_reference_casting
以包含转换为更大内存布局的引用 castnon_contiguous_range_endpoints
lintwasm_c_abi
lint 此 lint 当前仅在使用 Cargo 时有效。indirect_structural_match
和 pointer_structural_match
lint 以匹配 RFCPartialEq
类型的 const 作为模式成为硬错误refining_impl_trait
lint 拆分为 _reachable
、_internal
变体where
bounds 内部的关联类型时,删除不必要的类型推断trait Trait: Auto {}
:允许从 dyn Trait
向上转型为 dyn Trait + Auto
INVALID_DOC_ATTRIBUTES
lint 默认拒绝use
检查的准确性目标更改
wasm32-wasip1
tier 2(不带主机工具)目标wasm32-wasip2
tier 3 目标wasm32-wasi-preview1-threads
重命名为 wasm32-wasip1-threads
arm64ec-pc-windows-msvc
tier 3 目标armv8r-none-eabihf
tier 3 目标loongarch64-unknown-linux-musl
tier 3 目标请参阅 Rust 的 平台支持页面 了解有关 Rust 分层平台支持的更多信息。
RwLock
char::is_grapheme_extended
添加 ASCII 快速路径impl Read for &Stdin
std::error::Error
相关实现接受非 'static
生命周期impl<Fd: AsFd>
impl 接受 ?Sized
impl From<TryReserveError> for io::Error
这些 API 现在在 const 上下文中是稳定的
rust-version
--charset
target.<triple>.rustdocflags
impl Trait
的隐藏类型的 boundsarithmetic_overflow
lint 的覆盖范围const
初始化器中潜在内部可变性的检测 此代码被意外接受。此修复可能会破坏借用未知类型值的泛型代码,因为目前无法声明“此类型没有内部可变性”。未来,稳定化 Freeze
trait 将允许对此类代码进行适当的支持。这些更改不影响 Rust 的任何公共接口,但它们代表了对 rustc 和相关工具的性能或内部结构的重大改进。
x86_64-pc-windows-msvc
上使用 1CGU 构建 rustc
x86_64-apple-darwin
上使用 1CGU 构建 rustc
run-make
V2 基础设施、run_make_support
库,并移植 2 个测试作为示例static_mut_refs
以警告对可变静态变量的引用。unstable_features
并在编译器中使用它。soft_unstable
。i128
和 u128
在基于 x86 的目标上 16 字节对齐。--verbose
。unused_tuple_struct_fields
lint 合并到 dead_code
中。fn
/const
项的隐含 bounds 和良好形式检查。riscv32{im|imafc}-unknown-none-elf
目标提升至 tier 2。请参阅 Rust 的 平台支持页面 了解有关 Rust 分层平台支持的更多信息。
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
cargo::
扩展构建指令语法。id
格式为 PackageIDSpec
。cargo-util-schemas
作为 crate 提取出来。这些更改不影响 Rust 的任何公共接口,但它们代表了对 rustc 和相关工具的性能或内部结构的重大改进。
ambiguous_wide_pointer_comparisons
,它取代了 clippy::vtable_address_comparisons
unused_must_use
中 lint 标记为 pinned #[must_use]
的指针(特别是当 T
为 #[must_use]
时的 Box<T>
)。$message_type
字段以区分 json 诊断输出请参阅 Rust 的 平台支持页面 了解有关 Rust 分层平台支持的更多信息。
dbg!()
添加列号std::hash::{DefaultHasher, RandomState}
导出RwLockReadGuard
和 RwLockWriteGuard
的 Debug impls 添加 T: ?Sized。File::create
在隐藏文件上工作Arc::unwrap_or_clone
Rc::unwrap_or_clone
Result::inspect
Result::inspect_err
Option::inspect
type_name_of_val
std::hash::{DefaultHasher, RandomState}
这些以前仅通过 std::collections::hash_map
提供。ptr::{from_ref, from_mut}
ptr::addr_eq
请参阅 Cargo 发布说明。
()
且带有用户提供的 span 的 binding,这意味着此 lint 将警告用户代码。print_tts
此更改可能会破坏某些对 token tree 的朴素手动解析,这些解析期望 .to_string()
之后具有特定结构,而不是仅仅是任意 Rust 代码。IMPLIED_BOUNDS_ENTAILMENT
从 lint 变为硬错误impl FromIterator for Vec
以获取更多详细信息。default
async fn
和返回位置 impl Trait
。const
上下文中包含 &mut T
的函数指针签名。usize
/isize
。char
具有与 u32
相同的大小和对齐方式。match
中部分移动的值。COINDUCTIVE_OVERLAP_IN_COHERENCE
提升为 deny,并在依赖项中发出警告。riscv64-linux-android
目标规范。请参阅 Rust 的 平台支持页面 了解有关 Rust 分层平台支持的更多信息。
Waker::clone_from
以避免不必要地克隆 Waker
。VecDeque<u8>
实现 BufRead
。DecodeUtf16
实现 FusedIterator
。Not, Bit{And,Or}{,Assign}
。ExitCode
实现 Default
。str::SplitInclusive
的 DoubleEndedIterator
impl 的泛型 boundcfg(unix)
平台上的退出状态/等待状态。Atomic*::from_ptr
FileTimes
FileTimesExt
File::set_modified
File::set_times
IpAddr::to_canonical
Ipv6Addr::to_canonical
Option::as_slice
Option::as_mut_slice
pointer::byte_add
pointer::byte_offset
pointer::byte_offset_from
pointer::byte_sub
pointer::wrapping_byte_add
pointer::wrapping_byte_offset
pointer::wrapping_byte_sub
这些 API 现在在 const 上下文中是稳定的
Ipv6Addr::to_ipv4_mapped
MaybeUninit::assume_init_read
MaybeUninit::zeroed
mem::discriminant
mem::zeroed
#[repr(transparent)]
不是公共 ABI 的一部分,则隐藏它。const
上下文中成为硬错误。这些更改不影响 Rust 的任何公共接口,但它们代表了对 rustc 和相关工具的性能或内部结构的重大改进。
librustc_driver.so
。rustc-codegen-cranelift
作为 rustup 组件分发。std::mem::Discriminant<T>
不依赖于 T 中的任何生命周期private_in_public
lint 替换为 private_interfaces
和 private_bounds
,遵循 RFC 2145。 更多信息请阅读 RFC 2145。#[repr(Rust)]
async
代码块启用基于 MIR 的 drop 跟踪impl_trait_projections
PATH
选项,用于 --print KIND=PATH
*-apple-ios-macabi
启用 ASAN/LSAN/TSANi686-pc-windows-gnullvm
作为 tier 3 目标From<OwnedFd/Handle>
Vec<T>
实现 From<{&,&mut} [T; N]>
,其中 T: Clone
Rc<[T]>
和 Arc<[T]>
实现 From<[T; N]>
为 u16 实现 TryFrom<char>
io_error_other
featureSaturating
类型core::num::Saturating
为 std::process::Stdio 实现 From<io::Stdout>
为 std::process::Stdio 实现 From<io::Stderr>
为 std::process::Child{Stdin, Stdout, Stderr} 实现 From<OwnedHandle>
为 std::process::Child{Stdin, Stdout, Stderr} 实现 From<OwnedFd>
std::ffi::OsString::from_encoded_bytes_unchecked
std::ffi::OsString::into_encoded_bytes
std::ffi::OsStr::from_encoded_bytes_unchecked
std::ffi::OsStr::as_encoded_bytes
std::io::Error::other
为 u16 实现 TryFrom<char>
impl<T: Clone, const N: usize> From<&[T; N]> for Vec<T>
impl<T: Clone, const N: usize> From<&mut [T; N]> for Vec<T>
impl<T, const N: usize> From<[T; N]> for Arc<[T]>
impl<T, const N: usize> From<[T; N]> for Rc<[T]>
这些 API 现在在 const 上下文中是稳定的
Cargo.toml
中,稳定化 [lints]
--keep-going
构建标志--help
输出添加样式cargo clean
,添加 --dry-run
标志和结尾处的摘要行cargo update
,使 --package
更方便,使其成为位置参数cargo update
,将 –aggressive 的含义澄清为 –recursive--dry-run
的别名--package
标志)以解决歧义.cargo/config.toml
中,按优先级顺序合并列表target.'cfg(..)'.linker
添加支持--extern
中的无效 crate 名称impl From<{&,&mut} [T; N]> for Vec<T>
已知会在过度泛型的代码中引起一些推断失败。 在使用 tui
crate 的那些示例中,AsRef<_>
和 Into<Vec>
的组合使中间类型变得模糊,新的 impl
添加了另一种可能性,因此现在需要显式的类型注解。这些更改不影响 Rust 的任何公共接口,但它们代表了对 rustc 和相关工具的性能或内部结构的重大改进。
本周期无变更。
clippy::fn_null_check
lint 提升为 useless_ptr_null_checks
。noop_method_call
默认发出警告。try
和 async
的插值代码块。unconditional_recursion
lint 检测递归 drop。invalid_reference_casting
lint 现在是 deny-by-default(而不是 allow-by-default).comment
section 中写入版本信息。extern "thiscall"
和 "thiscall-unwind"
ABI。wasm32-wasi-preview1-threads
作为 tier 2 目标。请参阅 Rust 的 平台支持页面 了解有关 Rust 分层平台支持的更多信息。
Arc<File>
添加 Read
、Write
和 Seek
impl。io::Sink
的功能合并到 io::Empty
中。Backtrace
实现 RefUnwindSafe
ExitStatus
实现 Default
为 (Bound<usize>, Bound<usize>) 实现 SliceIndex<str>
assert_eq!
和 assert_ne!
panic 消息。stat
struct 定义。{integer}::div_ceil
{integer}::next_multiple_of
{integer}::checked_next_multiple_of
std::ffi::FromBytesUntilNulError
std::os::unix::fs::chown
std::os::unix::fs::fchown
std::os::unix::fs::lchown
LocalKey::<Cell<T>>::get
LocalKey::<Cell<T>>::set
LocalKey::<Cell<T>>::take
LocalKey::<Cell<T>>::replace
LocalKey::<RefCell<T>>::with_borrow
LocalKey::<RefCell<T>>::with_borrow_mut
LocalKey::<RefCell<T>>::set
LocalKey::<RefCell<T>>::take
LocalKey::<RefCell<T>>::replace
这些 API 现在在 const 上下文中是稳定的
这些更改不影响 Rust 的任何公共接口,但它们代表了对 rustc 和相关工具的性能或内部结构的重大改进。
rustc_apfloat
。internal_features
lint。#![cfg(FALSE)]
在 crate 根目录上的行为方式clippy::undropped_manually_drops
lintclippy::invalid_utf8_in_unchecked
lint 提升为 invalid_from_utf8_unchecked
和 invalid_from_utf8
clippy::cast_ref_to_mut
lint 提升为 invalid_reference_casting
clippy::cmp_nan
lint 提升为 invalid_nan_comparisons
dyn Trait
对象中,对于 Self: Sized bounds 的关联类型不再要求cfg
-ed out 项的名称,以便在诊断信息中提及它们-
作为输出文件给出,则写入 stdoutloongarch64-unknown-none*
添加 Tier 3 支持-C panic=abort
发出 .eh_frame
请参阅 Rust 的 平台支持页面 了解有关 Rust 分层平台支持的更多信息。
thread::{park, unpark}
的内存排序BufReader<T>
、BufWriter<T>
和 LineWriter<T>
上隐式的 T: Sized
boundselect_nth_unstable
的运行时保证Ok
Vec
实现 PartialOrd{Arc,Rc,Weak}::ptr_eq
忽略指针元数据这些 API 现在在 const 上下文中是稳定的
-Zdoctest-in-workspace
。当运行每个文档测试时,工作目录设置为测试所属 package 的根目录。 docs #12221 #12288build.jobs
并行度重置为默认值。 #12222Ipv6Addr
的 Display
mips*-unknown-linux-gnu*
目标从 host tier 2 降级为 target tier 3 支持。borrow()
时,不显示 suspicious_double_ref_op
lintderive(..)
中对缺少的方法使用 can_eq
建议raw-dylib
、link_ordinal
、import_name_type
和 -Cdlltool
。clippy::{drop,forget}_{ref,copy}
lints。Drop
impl 兼容性PlaceMention
中评估 place 表达式,使 let _ =
模式在 borrow checker 方面更加一致。--print deployment-target
标志。extern "C-unwind"
及其友元。 现有的 extern "C"
等可能会在未来的版本中更改跨语言展开的行为。*-linux-musl
目标上使用的 musl 版本更新至 1.2.3,在 32 位系统上启用 time64。debugger_visualizer
,用于嵌入元数据,如 Microsoft 的 Natvis。Self
尊重 tuple constructor 隐私。apple-m1
用作 aarch64-apple-darwin
的目标 CPU。x86_64h-apple-darwin
目标添加 Tier 3 支持。请参阅 Rust 的 平台支持页面 了解有关 Rust 分层平台支持的更多信息。
Drop
实现之前被捕获,但是在 panic hook 内 panic 现在会立即中止。From<&[T]> for Box<[T]>
bound 放宽至 T: Clone
。Error for mpsc::SendError<T>
和 TrySendError<T>
中不必要的 T: Send
bound。alloc::realloc
的文档,以匹配 Layout
要求,即大小不得超过 isize::MAX
。std::thread_local
的 const {}
语法。 此语法在 Rust 1.59 中已稳定化,但之前未在发行说明中提及。CStr::is_empty
BuildHasher::hash_one
NonZeroI*::is_positive
NonZeroI*::is_negative
NonZeroI*::checked_neg
NonZeroI*::overflowing_neg
NonZeroI*::saturating_neg
NonZeroI*::wrapping_neg
Neg for NonZeroI*
Neg for &NonZeroI*
From<[T; N]> for (T...)
(数组到 N 元组,N 在 1..=12 范围内)From<(T...)> for [T; N]
(N 元组到数组,N 在 1..=12 范围内)windows::io::AsHandle for Box<T>
windows::io::AsHandle for Rc<T>
windows::io::AsHandle for Arc<T>
windows::io::AsSocket for Box<T>
windows::io::AsSocket for Rc<T>
windows::io::AsSocket for Arc<T>
这些 API 现在在 const 上下文中是稳定的
<*const T>::read
<*const T>::read_unaligned
<*mut T>::read
<*mut T>::read_unaligned
ptr::read
ptr::read_unaligned
<[T]>::split_at
Cargo.toml
中使用命名的 debuginfo 选项。workspace_default_members
添加到 cargo metadata
的输出中。cargo new
/cargo init
时自动继承 workspace 字段。rustdoc::unescaped_backticks
lint。~~old~~
vs. ~new~
)TypeId
中移除结构匹配。 在模式中使用常量 TypeId
的代码可能会被破坏。已知的情况已经修复 - 特别是,使用 log
crate 的 kv_unstable
feature 的用户应更新到 log v0.4.18
或更高版本。sysroot
crate 来表示标准库 crates。 这不影响稳定版用户,但可能需要在构建自己的标准库的工具中进行调整。rustup
下的使用。 当 Cargo 检测到它将运行指向 rustup proxy 的 rustc
时,它将尝试绕过 proxy 并直接使用底层二进制文件。 存在关于与 rustup 和 RUSTUP_TOOLCHAIN
交互的假设。但是,预计不会影响普通用户。RUSTUP_HOME
和 RUSTUP_TOOLCHAIN
在 [env]
配置表中。 这被认为不是 Cargo 想要支持的用例,因为它很可能会引起问题或导致混淆。这些更改不影响 Rust 的任何公共接口,但它们代表了对 rustc 和相关工具的性能或内部结构的重大改进。
asm!
操作数的排序规则format_args
调用使用捕获let _ = expr
位置的表达式执行 const 和 unsafe 检查。-Cdebuginfo=line-tables-only
)提供了更小版本的 debuginfo,这最终可能成为 -Cdebuginfo=1
的默认设置。unused_allocation
lint 也针对 Box::new
loongarch64-unknown-linux-gnu
i586-pc-nto-qnx700
(QNX Neutrino RTOS, version 7.0) 添加 tier 3 目标,请参阅 Rust 的 平台支持页面 了解有关 Rust 分层平台支持的更多信息。
Command
优先使用非 verbatim 路径concat!
中使用负数值字面量Cell
内存布局的文档partial_cmp
来实现 tuple lt
/le
/ge
/gt
atomic_as_ptr
nonnull_slice_from_raw_parts
once_cell
nonzero_min_max
FnPtr
trait,该 trait 为所有函数指针实现 这扩展了所有 ABI 的函数指针的 Debug
、Pointer
、Hash
、PartialEq
、Eq
、PartialOrd
和 Ord
实现。NonZero*::MIN/MAX
BinaryHeap::retain
std::collections::binary_heap::IntoIter 的 Default
std::collections::btree_map::{IntoIter, Iter, IterMut} 的 Default
std::collections::btree_map::{IntoKeys, Keys} 的 Default
std::collections::btree_map::{IntoValues, Values} 的 Default
std::collections::btree_map::Range 的 Default
std::collections::btree_set::{IntoIter, Iter} 的 Default
std::collections::btree_set::Range 的 Default
std::collections::linked_list::{IntoIter, Iter, IterMut} 的 Default
std::vec::IntoIter 的 Default
std::iter::Chain 的 Default
std::iter::Cloned 的 Default
std::iter::Copied 的 Default
std::iter::Enumerate 的 Default
std::iter::Flatten 的 Default
std::iter::Fuse 的 Default
std::iter::Rev 的 Default
std::slice::Iter 的 Default
std::slice::IterMut 的 Default
Rc::into_inner
Arc::into_inner
std::cell::OnceCell
Option::is_some_and
NonNull::slice_from_raw_parts
Result::is_ok_and
Result::is_err_and
std::sync::atomic::Atomic*::as_ptr
std::io::IsTerminal
std::os::linux::net::SocketAddrExt
std::os::unix::net::UnixDatagram::bind_addr
std::os::unix::net::UnixDatagram::connect_addr
std::os::unix::net::UnixDatagram::send_to_addr
std::os::unix::net::UnixListener::bind_addr
std::path::Path::as_mut_os_str
std::sync::OnceLock
CARGO_PKG_README
sparse
成为 crates.io 的默认协议cargo logout
libtest
支持 -Zunstable-options
let _ = expr
位置的表达式执行 const 和 unsafe 检查。sign-ext
和 mutable-globals
功能 这可能会导致与旧的执行环境不兼容。这些更改不影响 Rust 的任何公共接口,但它们代表了对 rustc 和相关工具的性能或内部结构的重大改进。
Copy
字段一起使用。cmpxchg16b
target feature。Self: Autotrait
bounds。str
视为包含 [u8]
,用于 auto trait 目的。*-pc-windows-gnu
升级到 mingw-w64 v10 和 GCC 12.2。true
和 false
作为编译器参数中的布尔标志。repr(C)
enums 的大小为 c_int
。DispatchFromDyn
,允许下游实验自定义方法接收器。fmt::Arguments::as_str()
在优化后可能会在更多情况下返回 Some(_)
,可能会发生更改。Rc
实现 AsFd
和 AsRawFd
。这些 API 现在在 const 上下文中是稳定的
SocketAddr::new
SocketAddr::ip
SocketAddr::port
SocketAddr::is_ipv4
SocketAddr::is_ipv6
SocketAddrV4::new
SocketAddrV4::ip
SocketAddrV4::port
SocketAddrV6::new
SocketAddrV6::ip
SocketAddrV6::port
SocketAddrV6::flowinfo
SocketAddrV6::scope_id
cargo fix
或 cargo clippy --fix
。cargo add
。CARGO_BIN_NAME
环境变量。rustdoc::all
group 中包含 stable lints。!
结尾时,按 macro 搜索。rustup
的 rust-analysis
组件现在仅包含警告占位符。 这主要用于 RLS,并且相应的 -Zsave-analysis
标志也已从编译器中移除。default-features
设置为 false,并且成员的继承依赖项具有 default-features = true
时,Cargo 将启用该依赖项的默认 features。[env]
配置表中的 CARGO_HOME
。 Cargo 自身不会获取此值,但对 cargo 的递归调用会,这不是预期的行为。tools = [...]
,我们将尊重该列表中缺少的 rustdoc。 默认情况下,rustdoc 仍然包含在内。 要保留以前的行为,请显式地将 "rustdoc"
添加到列表中。这些更改不影响 Rust 的任何公共接口,但它们代表了对 rustc 和相关工具的性能或内部结构的重大改进。
@revoked
添加支持,并为 @cert-authority
添加更好的错误消息$prefix-clang
视为 clang
alloc
,而无需定义分配失败的处理程序。 定义自定义处理程序仍然不稳定。efiapi
调用约定。bindings_with_variant_name
更改为 deny-by-defaultarmv7-sony-vita-newlibeabihf
作为 tier 3 目标std::task::Context
!Send 和 !SyncOnceWith
和 RepeatWith
派生 DebugVec -> VecDeque
转换保证这些 API 现在在 const 上下文中是稳定的
cargo build --verbose
会告诉你更多关于为什么它要重新编译的信息。net.git-fetch-with-cli
选项,也显示 crates.io 索引更新的进度SEMICOLON_IN_EXPRESSIONS_FROM_MACROS
添加到未来不兼容报告-Zgcc-ld=lld
默认指定 --target
IMPLIED_BOUNDS_ENTAILMENT
提升为 Deny + ReportNowstd::task::Context
不再实现 Send 和 Sync这些更改不影响 Rust 的任何公共接口,但它们代表了对 rustc 和相关工具的性能或内部结构的重大改进。
x86_64-pc-windows-msvc
上为 rustc 启用 ThinLTOx86_64-apple-darwin
上为 rustc 启用 ThinLTOSized
谓词成为协归纳的,允许循环。#[must_use]
对 async fn
的注解也影响 Future::Output
。cfg(FALSE)
下不再是错误。C
或 cdecl
以外的调用约定启用 varargs 支持。verbatim
。已添加、更新和移除的目标
powerpc64-ibm-aix
。mipsel-sony-psx
。no_std
目标,aarch64-unknown-nto-qnx710
和 x86_64-pc-nto-qnx710
。aarch64-unknown-uefi
、i686-unknown-uefi
和 x86_64-unknown-uefi
。linuxkernel
目标(实际内核未使用)。请参阅 Rust 的 平台支持页面 了解有关 Rust 分层平台支持的更多信息。
crossbeam-channel
合并到 std::sync::mpsc
。ControlFlow
派生 Eq
和 Hash
。-C panic=abort
构建 compiler_builtins
。{integer}::checked_ilog
{integer}::checked_ilog2
{integer}::checked_ilog10
{integer}::ilog
{integer}::ilog2
{integer}::ilog10
NonZeroU*::ilog2
NonZeroU*::ilog10
NonZero*::BITS
这些 API 现在在 const 上下文中是稳定的
repr(Rust)
类型的布局现在将 m*2^n 大小的字段与等效对齐的字段分组。 这旨在进行优化,但也已知在少数情况下会增加类型大小以放置枚举标签。 请注意,repr(Rust)
类型的布局是实现细节,可能会发生更改。&&
和 ||
链现在将按从左到右的评估顺序从其子表达式中删除临时变量。 以前,它是“扭曲的”,使得第一个表达式在所有其他表达式按顺序删除后最后删除其临时变量。-export-dynamic
传递给 wasm-ld
。main
现在在 wasm32-wasi
上被 mangled 为 __main_void
。这些更改不影响 Rust 的任何公共接口,但它们代表了对 rustc 和相关工具的性能或内部结构的重大改进。
repr(Int)
枚举上指定显式判别式
impl Trait
上为 supertraits 触发 must_use
这使得 impl ExactSizeIterator
尊重 Iterator
上已有的 #[must_use]
注解。..=X
clippy::for_loops_over_fallibles
lint 提升到 rustcsym
操作数proc_macro::Span::source_text
uX::{checked_add_signed, overflowing_add_signed, saturating_add_signed, wrapping_add_signed}
iX::{checked_add_unsigned, overflowing_add_unsigned, saturating_add_unsigned, wrapping_add_unsigned}
iX::{checked_sub_unsigned, overflowing_sub_unsigned, saturating_sub_unsigned, wrapping_sub_unsigned}
BTreeSet::{first, last, pop_first, pop_last}
BTreeMap::{first_key_value, last_key_value, first_entry, last_entry, pop_first, pop_last}
AsFd
实现。impl TryFrom<Vec<T>> for Box<[T; N]>
core::hint::black_box
Duration::try_from_secs_{f32,f64}
Option::unzip
std::os::fd
有关更多信息,请参阅 详细发行说明。
ProceduralMasquerade
hack 应用于旧版本的 rental
__heap_base
和 __data_end
。__wasm_init_memory
。__tls_*
。libresolv
libstd
不再在 Darwin 上拉取 libiconv.dylib
)order_dependent_trait_objects
出现在未来破坏性报告中这些更改不影响 Rust 的任何公共接口,但它们代表了对 rustc 和相关工具的性能或内部结构的重大改进。
as
转换带有 #[non_exhaustive]
变体的枚举时报错let else
let_underscore_drop
和 let_underscore_lock
break
(“label-break-value”)MaybeUninit
是处理未初始化内存的正确方法。Drop
special_module_name
lint-C instrument-coverage
时默认生成唯一 profraw 文件的支持新目标
PartialEq::ne
BCRYPT_RNG_ALG_HANDLE
System
与直接系统分配器调用混合使用std::layout::Layout
大小在向上舍入到 align
时不得溢出 isize::MAX
这也更改了 Layout::from_size_align_unchecked
的安全条件。std::backtrace::Backtrace
Bound::as_ref
std::io::read_to_string
<*const T>::cast_mut
<*mut T>::cast_const
这些 API 现在在 const 上下文中是稳定的
std::layout::Layout
大小在向上舍入到 align
时不得溢出 isize::MAX
。 这也更改了 Layout::from_size_align_unchecked
的安全条件。PollFn
现在仅当闭包为 Unpin
时才实现 Unpin
。 如果用户依赖于 blanket unpin 实现,这可能是一个破坏性更改。 有关为何进行此更改的详细信息,请参阅 PR 上的讨论。#![cfg_attr(..., crate_type = ...)]
来设置 crate 类型 这加强了 forward compatibility lint deprecated_cfg_attr_crate_type_name 以拒绝。llvm-has-rust-patches
允许设置构建系统以将 LLVM 视为具有 Rust 特定的补丁 对于通过 llvm-config
而不是内置 LLVM 构建带有补丁 LLVM 的 Rust 发行版,可能需要设置此选项。lld
可能会遇到链接器限制。 有关更多信息,请参阅 issue 102754。这些更改不影响 Rust 的任何公共接口,但它们代表了对 rustc 和相关工具的性能或内部结构的重大改进。
x.sh
和 x.ps1
shell 脚本&T
指向的内存 如果 T
中的每个字节都在 UnsafeCell
内unused_tuple_struct_fields
,类似于现有未使用的结构字段的警告。 此 lint 将在未来成为默认警告。#[used]
编译为 llvm.compiler.used--diagnostic-width
编译器标志以定义终端宽度。rust-lld
的支持write!
或 writeln!
写入 OsString
:为 OsString
实现 fmt::Write
std::net::[Into]Incoming
实现 FusedIterator
impl<T: AsRawFd> AsRawFd for {Arc,Box}<T>
ptr::copy
和 ptr::swap
正在执行无类型复制available_parallelism
添加 cgroupv1 支持mem::uninitialized
的不正确使用future::IntoFuture
future::poll_fn
task::ready!
num::NonZero*::checked_mul
num::NonZero*::checked_pow
num::NonZero*::saturating_mul
num::NonZero*::saturating_pow
num::NonZeroI*::abs
num::NonZeroI*::checked_abs
num::NonZeroI*::overflowing_abs
num::NonZeroI*::saturating_abs
num::NonZeroI*::unsigned_abs
num::NonZeroI*::wrapping_abs
num::NonZeroU*::checked_add
num::NonZeroU*::checked_next_power_of_two
num::NonZeroU*::saturating_add
os::unix::process::CommandExt::process_group
os::windows::fs::FileTypeExt::is_symlink_dir
os::windows::fs::FileTypeExt::is_symlink_file
这些类型以前在 std::ffi
中是稳定的,但现在在 core
和 alloc
中也可用
core::ffi::CStr
core::ffi::FromBytesWithNulError
alloc::ffi::CString
alloc::ffi::FromVecWithNulError
alloc::ffi::IntoStringError
alloc::ffi::NulError
这些类型以前在 std::os::raw
中是稳定的,但现在在 core::ffi
和 std::ffi
中也可用
ffi::c_char
ffi::c_double
ffi::c_float
ffi::c_int
ffi::c_long
ffi::c_longlong
ffi::c_schar
ffi::c_short
ffi::c_uchar
ffi::c_uint
ffi::c_ulong
ffi::c_ulonglong
ffi::c_ushort
这些 API 现在可以在 const 上下文中使用
workspace.package
和 workspace.dependencies
。--target
标志来一次为多个目标构建,并且 build.target
配置选项现在可以接受多个目标的数组。--jobs
参数现在可以接受负数,以从最大 CPU 数倒数。cargo add
现在将更新 Cargo.lock
。cargo rustc
添加了 --crate-type
标志以覆盖 crate 类型。rev
字段中的哈希从 GitHub 获取 git 依赖项时的性能。-linux-gnu
目标,所有 -linux-gnu
目标的最低要求版本现在至少为内核 3.2 和 glibc 2.17:提高最低 linux-gnu 版本transmute_copy
的 U
不大于 T
BTreeMap
中的一个健全性错误,该错误允许在其借用的数据之前删除容器。thumbv6m-none-eabi
目标上,如果某些不正确的 asm!
语句使用高寄存器(r8 到 r14)作为输入/输出操作数,则会被错误地接受。 这不再被接受。impl Trait
被意外接受为返回位置 impl Trait
的关联类型值,而没有满足该关联类型的所有 trait 边界,只要隐藏类型满足所述边界即可。 这已被修复。这些更改不影响 Rust 的任何公共接口,但它们代表了对 rustc 和相关工具的性能或内部结构的重大改进。
Vec::insert
,以处理 index == len
的情况。impl Trait
参数的情况下显式泛型参数。cenum_impl_drop_cast
警告成为默认拒绝。-C panic=abort
时阻止展开。bundle
原生库修饰符, 同时也删除了已弃用的 static-nobundle
链接类型。* 有关 Rust 分层平台支持的更多信息,请参阅 Rust 的 平台支持页面。
core::fmt::Alignment
实现 Copy
、Clone
、PartialEq
和 Eq
。ptr::null
和 null_mut
扩展到所有 thin 类型(包括 extern 类型)。为 VecDeque<u8> 实现 Read 和 Write
.[OsStr]::join
的内部 traits。core::alloc::Layout
实现 Hash
。OsString
添加容量文档。std::mem::needs_drop
接受 ?Sized
。impl Termination for Infallible
,然后使 Termination
的 Result
impls 更通用。/proc/self/mem
的立场。array::from_fn
Box::into_pin
BinaryHeap::try_reserve
BinaryHeap::try_reserve_exact
OsString::try_reserve
OsString::try_reserve_exact
PathBuf::try_reserve
PathBuf::try_reserve_exact
Path::try_exists
Ref::filter_map
RefMut::filter_map
NonNull::<[T]>::len
ToOwned::clone_into
Ipv6Addr::to_ipv4_mapped
unix::io::AsFd
unix::io::BorrowedFd<'fd>
unix::io::OwnedFd
windows::io::AsHandle
windows::io::BorrowedHandle<'handle>
windows::io::OwnedHandle
windows::io::HandleOrInvalid
windows::io::HandleOrNull
windows::io::InvalidHandleError
windows::io::NullHandleError
windows::io::AsSocket
windows::io::BorrowedSocket<'handle>
windows::io::OwnedSocket
thread::scope
thread::Scope
thread::ScopedJoinHandle
这些 API 现在可以在 const 上下文中使用
array::from_ref
slice::from_ref
intrinsics::copy
intrinsics::copy_nonoverlapping
<*const T>::copy_to
<*const T>::copy_to_nonoverlapping
<*mut T>::copy_to
<*mut T>::copy_to_nonoverlapping
<*mut T>::copy_from
<*mut T>::copy_from_nonoverlapping
str::from_utf8
Utf8Error::error_len
Utf8Error::valid_up_to
Condvar::new
Mutex::new
RwLock::new
#[link]
属性现在检查得更严格, 这可能会为以前被忽略的无效属性参数引入错误。Duration
时现在使用舍入。 转换后的 duration 可能与以前略有不同。这些更改不提供直接面向用户的好处,但代表了对 rustc 和相关工具的内部结构和整体性能的重大改进。
Rust 1.62.1 解决了编译器和标准库中的一些最新回归问题,并缓解了 Intel SGX 上的 CPU 漏洞。
impl Trait
返回类型的不健全函数强制转换。async fn
生命周期 的增量编译错误。x86_64-fortanix-unknown-sgx
目标为 MMIO 陈旧数据漏洞添加了缓解措施,建议 INTEL-SA-00615。#[default]
变体的枚举上稳定 #[derive(Default)]
const
函数现在可以指定 extern "C"
或 extern "Rust"
unaligned_references
lint 成为默认拒绝 此 lint 也是未来兼容性 lint,预计最终会成为硬错误。#[thread_local]
属性aarch64-pc-windows-gnullvm
和 x86_64-pc-windows-gnullvm
目标*x86_64-unknown-none
目标提升到 Tier 2** 有关 Rust 分层平台支持的更多信息,请参阅 Rust 的 平台支持页面。
bool::then_some
f32::total_cmp
f64::total_cmp
Stdin::lines
windows::CommandExt::raw_arg
impl<T: Default> Default for AssertUnwindSafe<T>
From<Rc<str>> for Rc<[u8]>
From<Arc<str>> for Arc<[u8]>
FusedIterator for EncodeWide
cargo add
命令,用于从命令行向 Cargo.toml
添加依赖项。 文档name@version
语法,以及之前的 name:version
,以与 cargo add
和其他工具的行为对齐。 cargo install
和 cargo yank
现在也支持此语法,因此版本不需要作为单独的标志传递。~/.cargo
)中的 git
和 registry
目录现在标记为缓存目录,以便它们不包含在备份或内容索引(在 Windows 上)中。@
argfile 支持,如果 rustc
的命令行超过操作系统的限制,它将使用“response files”。cargo test
现在将 --target
传递给 rustdoc
。 #10594macro_rules!
宏上运行,匹配其他私有项File
读取或写入无法同步完成,则中止.这些更改不提供直接面向用户的好处,但代表了对 rustc 和相关工具的内部结构和整体性能的重大改进。
const fn
签名现在可以包含泛型 trait 边界const fn
签名现在可以在参数和返回位置使用 impl Trait
const fn
中创建、转换和传递impl Trait
返回类型的值#[link]
属性和命令行中使用链接修饰符语法,以及特别的 whole-archive
修饰符char
类型在 debuginfo 中被描述为 UTF-32#[target_feature]
属性 可以与 aarch64 功能一起使用#[target_feature = "adx"]
现在已稳定ManuallyDrop<T>
与 T
具有相同的内存布局#[ignore = "…"]
消息std::io::stdio::lock()
返回 'static
句柄。 之前,创建 stdin/stdout/stderr 的锁定句柄会借用正在锁定的句柄,这会阻止编写 let out = std::io::stdout().lock();
,因为 out
的生命周期会比 stdout()
的返回值长。现在的代码可以正常工作,消除了影响许多 Rust 用户的常见陷阱。Vec::from_raw_parts
现在对其输入的限制更少std::thread::available_parallelism
现在将 cgroup 配额考虑在内。 由于 available_parallelism
通常用于创建用于并行计算的线程池(这可能会因性能而受 CPU 限制),因此如果可能,available_parallelism
将返回与持续使用那么多线程的能力一致的值。例如,在具有 8 个虚拟 CPU 但配额仅允许使用 50% 的容器中,available_parallelism
将返回 4。Pin::static_mut
Pin::static_ref
Vec::retain_mut
VecDeque::retain_mut
Cursor<[u8; N]>
的 Write
std::os::unix::net::SocketAddr::from_pathname
std::process::ExitCode
和 std::process::Termination
。 这两个 API 的稳定化现在使程序可以从 main
返回带有自定义退出代码的错误。std::thread::JoinHandle::is_finished
这些 API 现在可以在 const 上下文中使用
<*const T>::offset
和 <*mut T>::offset
<*const T>::wrapping_offset
和 <*mut T>::wrapping_offset
<*const T>::add
和 <*mut T>::add
<*const T>::sub
和 <*mut T>::sub
<*const T>::wrapping_add
和 <*mut T>::wrapping_add
<*const T>::wrapping_sub
和 <*mut T>::wrapping_sub
<[T]>::as_mut_ptr
<[T]>::as_ptr_range
<[T]>::as_mut_ptr_range
没有功能变更,但请参阅兼容性说明。
whole-archive
,但现在 rustc 尝试不使用 whole-archive
,除非明确请求。 此更改可能会在某些情况下导致链接错误。 要修复此类错误,需要重新排序从命令行、构建脚本或 #[link]
属性 链接的原生库a
依赖于 b
,则 a
应在前,b
在后)+whole-archive
修饰符。ident
匹配器r#
原始字符串字面量中 #
的数量必须少于 256 个cargo vendor
现在每个 --sync
标志仅接受一个值all()
和 any()
中的 cfg
谓词始终会被评估以检测错误,而不是短路。 此处的兼容性考虑出现在仅在 nightly 版本中使用的代码中,这些代码使用 all
的短路行为来编写类似 cfg(all(feature = "nightly", syntax-requiring-nightly))
的内容,现在将无法编译。 请改为使用 cfg_attr(feature = "nightly", ...)
或嵌套使用 cfg
。这些更改不提供直接面向用户的好处,但代表了对 rustc 和相关工具的内部结构和整体性能的重大改进。
"unwind"
或 "abort"
的 #[cfg(panic = "...")]
。"ptr"
的 #[cfg(target_has_atomic = "...")]
。x86_64-unknown-linux-gnu
上启用组合 +crt-static
和 relocation-model=pic
unreachable_pub
lint-Z instrument-coverage
为 -C instrument-coverage
-Z print-link-args
为 --print link-args
mips64-openwrt-linux-musl
*armv7-unknown-linux-uclibceabi
(softfloat)*RUST_BACKTRACE=full
* 有关 Rust 分层平台支持的更多信息,请参阅 Rust 的 平台支持页面。
sort_by_cached_key
的调用顺序Duration::try_from_secs_f32
/f64
的精度Instant::{duration_since, elapsed, sub}
饱和Instant::now
中非单调时钟的解决方法BuildHasherDefault
、iter::Empty
和 future::Pending
协变Arc::new_cyclic
Rc::new_cyclic
slice::EscapeAscii
<[u8]>::escape_ascii
u8::escape_ascii
Vec::spare_capacity_mut
MaybeUninit::assume_init_drop
MaybeUninit::assume_init_read
i8::abs_diff
i16::abs_diff
i32::abs_diff
i64::abs_diff
i128::abs_diff
isize::abs_diff
u8::abs_diff
u16::abs_diff
u32::abs_diff
u64::abs_diff
u128::abs_diff
usize::abs_diff
io::ErrorKind 的 Display
ExitCode 的 From<u8>
Not for !
(“never” 类型)Assign<$t> for Wrapping<$t>
arch::is_aarch64_feature_detected!
toml-rs
移植到 toml_edit
-Ztimings
为 --timings
cargo:rustc-link-arg-*
类型。Instant::now
中删除对具有非单调时钟的平台的缓解措施。 在不提供单调时钟的平台上,不再保证 instant 大于较早的 instant。Instant::{duration_since, elapsed, sub}
不再在下溢时 panic,而是饱和到 0
。 在现实世界中,panic 主要发生在具有错误单调时钟实现的平台上,而不是捕获编程错误(例如反转开始和结束时间)。 现在,此类编程错误将导致 0
而不是 panic。这些更改不提供直接面向用户的好处,但代表了对 rustc 和相关工具的内部结构和整体性能的重大改进。
-Cremark
启用时,发出 LLVM 优化备注#[test]
的内置属性宏时发出警告。-Z emit-future-incompat
为 --json future-incompat
此版本禁用了增量编译,除非用户通过新添加的 RUSTC_FORCE_INCREMENTAL=1 环境变量明确选择加入。 这是由于增量编译中已知且相对频繁发生的错误,该错误导致构建发出内部编译器错误。 这个特殊的错误已经在 nightly 版本中修复,但该修复尚未推广到 stable 版本,并且被认为直接向 stable 版本进行反向移植风险太大。
与往常一样,我们鼓励用户使用 nightly 版本进行测试并报告错误,以便我们可以跟踪失败并更早地修复问题。
有关更多详细信息,请参见 94124。
std::thread::available_parallelism
Result::copied
Result::cloned
arch::asm!
arch::global_asm!
ops::ControlFlow::is_break
ops::ControlFlow::is_continue
u8 的 TryFrom<char>
char::TryFromCharError
实现 Clone
、Debug
、Display
、PartialEq
、Copy
、Eq
、Error
iter::zip
NonZeroU8::is_power_of_two
NonZeroU16::is_power_of_two
NonZeroU32::is_power_of_two
NonZeroU64::is_power_of_two
NonZeroU128::is_power_of_two
NonZeroUsize::is_power_of_two
ToLowercase 的 DoubleEndedIterator
ToUppercase 的 DoubleEndedIterator
[T; N] 的 TryFrom<&mut [T]>
Once 的 UnwindSafe
Once 的 RefUnwindSafe
Const-stable
mem::MaybeUninit::as_ptr
mem::MaybeUninit::assume_init
mem::MaybeUninit::assume_init_ref
ffi::CStr::from_bytes_with_nul_unchecked
strip
profile 选项--release
缩写为 -r
term.quiet
配置--host
#![cfg_attr]
内的 crate_type 和 crate_name 这添加了一个未来的兼容性 lint,以支持使用 cfg_attr 包装 Rust 文件中的 crate_type 或 crate_name 规范; 建议用户迁移到设置等效的命令行标志。#[no_link]
属性对名称解析的影响 这可能会公开新名称,从而导致与给定命名空间中已存在的名称冲突并导致编译失败。这些更改不提供直接面向用户的好处,但代表了对 rustc 和相关工具的内部结构和整体性能的重大改进。
std::fs::remove_dir_all
中的竞争条件 (CVE-2022-21658)useless_format
Clippy lint 中捕获的参数non_send_fields_in_send_ty
Clippy lint 移至 nursery{ident}
来捕获参数。 这在所有接受格式化字符串的宏中都有效。 在 panic!
(panic!("{ident}")
) 中对此的支持需要 2021 edition; 早期版本中看起来试图使用此功能的 panic 调用将导致关于没有预期效果的警告 lint。*const T
指针现在可以在 const 上下文中被解引用。Unsize
的规则。strip
选项删除这些符号以生成更小的 release 二进制文件。 请注意,此版本仅包含 rustc 中的支持,而不是直接在 cargo 中。-Cremark
启用时,发出 LLVM 优化备注x86_64-unknown-none
* 有关 Rust 分层平台支持的更多信息,请参阅 Rust 的 平台支持页面。
#[must_use]
注解,在忽略其返回值时产生警告。 这有助于捕获诸如期望函数就地修改值而不是返回值之类错误。copy
和 copy_nonoverlapping
的调试检查Rc<T>
实现 RefUnwindSafe
Result<Infallible, E>
实现 Termination
。 这允许编写 fn main() -> Result<Infallible, ErrorType>
,用于成功的退出永远不涉及从 main
返回的程序(例如,调用 exit
或使用 exec
运行另一个程序的程序)。Metadata::is_symlink
Path::is_symlink
{integer}::saturating_div
Option::unwrap_unchecked
Result::unwrap_unchecked
Result::unwrap_err_unchecked
File::options
这些 API 现在可以在 const 上下文中使用
Duration::new
Duration::checked_add
Duration::saturating_add
Duration::checked_sub
Duration::saturating_sub
Duration::checked_mul
Duration::saturating_mul
Duration::checked_div
std::process::Command
将不再在当前目录中搜索可执行文件。这些更改不提供直接面向用户的好处,但代表了对 rustc 和相关工具的内部结构和整体性能的重大改进。
#[derive]
,并将看到原始(pre-cfg
)输入。m!{ .. }.method()
和 m!{ .. }?
。Clone
和 Debug
实现。armv6k-nintendo-3ds
。armv7-unknown-linux-uclibceabihf
。m68k-unknown-linux-gnu
。aarch64-kmc-solid_asp3
、armv7a-kmc-solid_asp3-eabi
、armv7a-kmc-solid_asp3-eabihf
* 有关 Rust 分层平台支持的更多信息,请参阅 Rust 的 平台支持页面。
Vec::leak
中的分配和复制Ordering
添加 #[repr(i8)]
File::read_to_end
和 read_to_string
#[must_use]
,在忽略其返回值时产生警告。 这有助于捕获诸如期望函数就地修改值而不是返回值之类错误。[T; N]::as_mut_slice
[T; N]::as_slice
collections::TryReserveError
HashMap::try_reserve
HashSet::try_reserve
String::try_reserve
String::try_reserve_exact
Vec::try_reserve
Vec::try_reserve_exact
VecDeque::try_reserve
VecDeque::try_reserve_exact
Iterator::map_while
iter::MapWhile
proc_macro::is_available
Command::get_program
Command::get_args
Command::get_envs
Command::get_current_dir
CommandArgs
CommandEnvs
这些 API 现在可以在 const 上下文中使用
Clone
和 Debug
实现。 这将破坏一些设置了 #![deny(dead_code)]
的构建。这些更改不提供直接面向用户的好处,但代表了对 rustc 和相关工具的内部结构和整体性能的重大改进。
binding @ pattern
中的 pattern 现在也可以引入新的绑定。const fn
中是允许的。--force-warn
强制启用警告。 此功能主要供 cargo fix
使用,而不是最终用户。aarch64-apple-ios-sim
提升为 Tier 2*。powerpc-unknown-freebsd
。riscv32imc-esp-espidf
。* 有关 Rust 分层平台支持的更多信息,请参阅 Rust 的 平台支持页面。
AtomicU{64,128}
而不是 Mutex 来保护 Instant 回退。 对于此用例,原子操作在争用下可更好地扩展。(Extend<A>, Extend<B>)
实现 Extend<(A, B)>
From<[(K, V); N]>
。P: Unpin
bound。=
),则环境函数会 panic。 现在,这些函数只会将此类名称视为不存在的变量,因为操作系统无法表示具有此类名称的变量的存在。std::os::unix::fs::chroot
UnsafeCell::raw_get
BufWriter::into_parts
core::panic::{UnwindSafe, RefUnwindSafe, AssertUnwindSafe}
这些 API 以前在 std
中是稳定的,但现在在 core
中也可用。Vec::shrink_to
String::shrink_to
OsString::shrink_to
PathBuf::shrink_to
BinaryHeap::shrink_to
VecDeque::shrink_to
HashMap::shrink_to
HashSet::shrink_to
这些 API 现在可以在 const 上下文中使用
SEMICOLON_IN_EXPRESSIONS_FROM_MACROS
默认发出警告Command::pre_exec
调用 libc::getpid
/ std::process::id
在 glibc <= 2.24 上可能会返回不同的值。 Rust 现在直接调用 clone3
系统调用(如果可用),以使用通过该系统调用提供的新功能。 较旧版本的 glibc 缓存 getpid
的结果,并且仅在调用 glibc 的 clone/fork 函数时才更新该缓存,因此直接系统调用绕过了该缓存更新。 glibc 2.25 和更新版本不再缓存 getpid
,原因正是如此。这些更改不提供直接面向用户的好处,但代表了对 rustc 和相关工具的内部结构和整体性能的重大改进。
X..
),它将从 X
开始,并在整数的最大值处结束。std::prelude
显式导入不同 edition 的 prelude(例如 use std::prelude::rust_2021::*;
)。* 有关 Rust 分层平台支持的更多信息,请参阅 Rust 的 平台支持页面。
string::Drain
现在实现了 AsRef<str>
和 AsRef<[u8]>
。Bound::cloned
Drain::as_str
IntoInnerError::into_error
IntoInnerError::into_parts
MaybeUninit::assume_init_mut
MaybeUninit::assume_init_ref
MaybeUninit::write
array::map
ops::ControlFlow
x86::_bittest
x86::_bittestandcomplement
x86::_bittestandreset
x86::_bittestandset
x86_64::_bittest64
x86_64::_bittestandcomplement64
x86_64::_bittestandreset64
x86_64::_bittestandset64
以下先前稳定的函数现在是 const
。
cargo test
时),Cargo 现在将重复数据删除编译器诊断到终端。cargo metadata
中的包定义现在包含来自 manifest 的 "default_run"
字段。cargo d
作为 cargo doc
的别名。cargo tree
添加了 {lib}
作为格式化选项,用于打印包的 "lib_name"
。CTRL+F
等工具搜索到。#[doc(hidden)]
标记的 Traits 将不再出现在“Trait Implementations”部分。io::Error
的 std 函数将不再使用 ErrorKind::Other
变体。 这是为了更好地反映这些类型的错误可以被分类为更新的更具体的 ErrorKind
变体,并且它们不代表用户错误。process::Command
的环境变量名称现在表现如预期。 之前使用 Command
的环境变量会导致它们被转换为 ASCII 大写。rustdoc::
前缀的 rustdoc lints。RUSTFLAGS
不再为 build scripts 设置。Build scripts 应该使用 CARGO_ENCODED_RUSTFLAGS
代替。有关更多详细信息,请参阅文档。现在可以在某些内置属性的值中使用宏。 这主要允许您在 #[doc]
属性中调用宏。例如,要在您的 crate 中包含外部文档,您现在可以编写以下内容
现在可以在 const fn
中在 unsized slice 类型(以及包含 unsized slice 的类型)之间进行转换。
现在可以将多个泛型生命周期与 impl Trait
一起使用,其中生命周期没有显式地 outlive 另一个。 在代码中,这意味着您现在可以拥有 impl Trait<'a, 'b>
,而在之前您只能拥有 impl Trait<'a, 'b> where 'b: 'a
。
/lib/rustlib/<target-triple>/target.json
中搜索自定义 JSON targets,其中 /
是 “sysroot” 目录。 您可以通过运行 rustc --print sysroot
找到您的 sysroot 目录。wasm
作为 WebAssembly 平台的 target_family
。#[target_feature]
。bpfel-unknown-none
和 bpfeb-unknown-none
添加了 tier 3* 支持。-Zmutable-noalias=yes
。* 有关 Rust 分层平台支持的更多信息,请参阅 Rust 的 平台支持页面。
panic::panic_any
现在将 #[track_caller]
。OutOfMemory
作为 io::ErrorKind
的一个变体。proc_macro::Literal
现在实现了 FromStr
。BTreeMap::into_keys
BTreeMap::into_values
HashMap::into_keys
HashMap::into_values
arch::wasm32
VecDeque::binary_search
VecDeque::binary_search_by
VecDeque::binary_search_by_key
VecDeque::partition_point
cargo-tree
添加了 --prune <spec>
选项,以从依赖关系图中移除一个包。cargo-tree
添加了 --depth
选项,以仅打印树中特定深度的内容cargo-tree --edges
添加了 no-proc-macro
值,以隐藏 procedural macro 依赖项。CARGO_TARGET_TMPDIR
的环境变量可用。 此变量指向一个目录,integration tests 和 benches 可以将其用作测试文件系统操作的 “scratchpad”。?
混合 Option 和 Result。std::arch
intrinsics 现在使用比以前更严格的 const 检查,并且可能拒绝一些以前接受的代码。codegen-units = 1
编译时,i128
乘法目前无条件地导致溢出。◆
或 🦀
。更具体地说,您现在可以使用任何符合 UAX #31 “Unicode Identifier and Pattern Syntax” 标准的标识符。这与 Python 等语言的标准相同,但是 Rust 使用 NFC normalization,这可能与其他语言不同。|
(OR)。例如:
:pat_param
macro_rules!
matcher。 此 matcher 具有与 :pat
matcher 相同的语义。这是为了允许 :pat
在未来的 edition 中更改语义,成为 pattern fragment。wasm64-unknown-unknown
target 添加了 Tier 3* 支持。* 有关 Rust 分层平台支持的更多信息,请参阅 Rust 的 平台支持页面。
android_set_abort_message
。slice::IterMut<'_, T>
现在实现了 AsRef<[T]>
IntoIterator
。 目前,在数组上作为方法调用 .into_iter()
将返回 impl Iterator<Item=&T>
,但这可能会在未来的 edition 中更改为将 Item
更改为 T
。直接在数组上调用 IntoIterator::into_iter
将按预期提供 impl Iterator<Item=T>
。leading_zeros
和 trailing_zeros
现在在所有 NonZero
整数类型上都可用。{f32, f64}::from_str
现在根据 IEEE 754 解析和打印特殊值 (NaN
, -0
)。(Bound<usize>, Bound<usize>)
索引 slice。BITS
关联常量添加到所有数字类型。AtomicBool::fetch_update
AtomicPtr::fetch_update
BTreeMap::retain
BTreeSet::retain
BufReader::seek_relative
DebugStruct::non_exhaustive
Duration::MAX
Duration::ZERO
Duration::is_zero
Duration::saturating_add
Duration::saturating_mul
Duration::saturating_sub
ErrorKind::Unsupported
Option::insert
Ordering::is_eq
Ordering::is_ge
Ordering::is_gt
Ordering::is_le
Ordering::is_lt
Ordering::is_ne
OsStr::is_ascii
OsStr::make_ascii_lowercase
OsStr::make_ascii_uppercase
OsStr::to_ascii_lowercase
OsStr::to_ascii_uppercase
Peekable::peek_mut
Rc::decrement_strong_count
Rc::increment_strong_count
Vec::extend_from_within
array::from_mut
array::from_ref
cmp::max_by_key
cmp::max_by
cmp::min_by_key
cmp::min_by
f32::is_subnormal
f64::is_subnormal
HEAD
branch 不是 “master” 的 git 仓库。 这也包括切换到版本 3 Cargo.lock
格式,它可以正确处理默认分支。unpacked
split-debuginfo。authors
字段不再包含在 Cargo.toml
中。Ipv4::from_str
现在除了拒绝十六进制 IP 地址外,还将拒绝八进制格式的 IP 地址。 八进制格式可能会导致混淆和潜在的安全漏洞,并且不再推荐使用。BITS
常量可能与外部定义冲突。 特别是,已知这在 lexical-core
crate 中是一个问题,但他们已经发布了针对语义版本 0.4 到 0.7 的修复程序。要单独更新此依赖项,请使用 cargo update -p lexical-core
。RUSTC_FORCE_INCREMENTAL=1
环境变量。这些更改不提供直接面向用户的好处,但代表了对 rustc 和相关工具的内部结构和整体性能的重大改进。
std::sys::windows::alloc
实现。get_blanket_impls
中的 blanket impls此版本禁用增量编译,除非用户已通过新添加的 RUSTC_FORCE_INCREMENTAL=1 环境变量显式选择启用。
这是由于 Rust 用户在 1.52.0 中新启用的增量验证中遇到的广泛且频繁发生的 breakage。值得注意的是,Rust 用户应该升级到 1.52.0 或 1.52.1:新添加的增量验证检测到的错误仍然存在于过去的稳定版本中,并且尚未在任何 channel 上修复。这些错误可能导致 Rust 二进制文件的错误编译。
这些问题仅影响增量构建,因此除非用户明确选择启用增量编译,否则使用 Cargo 的 release 构建应该不受影响。Debug 和 check 构建会受到影响。
有关更多详细信息,请参阅 84970。
unsafe_op_in_unsafe_fn
lint,它检查 unsafe fn
中的 unsafe 代码是否被包装在 unsafe
block 中。 默认允许此 lint,并且在未来的 edition 中可能会变成 warning 或 hard error。为以下 targets 添加了 tier 3* 支持。
s390x-unknown-linux-musl
riscv32gc-unknown-linux-musl
& riscv64gc-unknown-linux-musl
powerpc-unknown-openbsd
* 有关 Rust 分层平台支持的更多信息,请参阅 Rust 的 平台支持页面。
OsString
现在实现了 Extend
和 FromIterator
。cmp::Reverse
现在具有 #[repr(transparent)]
表示形式。Arc<impl Error>
现在实现了 error::Error
。const
。Arguments::as_str
char::MAX
char::REPLACEMENT_CHARACTER
char::UNICODE_VERSION
char::decode_utf16
char::from_digit
char::from_u32_unchecked
char::from_u32
slice::partition_point
str::rsplit_once
str::split_once
以下以前稳定的 API 现在是 const
。
char::len_utf8
char::len_utf16
char::to_ascii_uppercase
char::to_ascii_lowercase
char::eq_ignore_ascii_case
u8::to_ascii_uppercase
u8::to_ascii_lowercase
u8::eq_ignore_ascii_case
rustdoc::
为前缀(例如 #[warn(rustdoc::broken_intra_doc_links)]
)。 仍然允许使用旧样式,并且在未来的版本中将变为 warning。- [x] Complete
- [ ] Todo
cargo test -- foo bar
将运行所有匹配 foo
和 bar
的 tests。std
库分发 PDB symbols,允许您在调试时查看 std
symbols。这些更改不提供直接面向用户的好处,但代表了对 rustc 和相关工具的内部结构和整体性能的重大改进。
RUSTC_BOOTSTRAP
。x86_64-rumprun-netbsd
target 的支持。x86_64-sun-solaris
target,转而使用 x86_64-pc-solaris
。,
,
, 和 \t
作为在代码块中指定语言的分隔符。pub_use_of_private_extern_crate
的情况proc-macro-hack
版本一起使用时出现 panics。cargo update
应该足以在所有情况下修复此问题。#[derive]
转换为常规宏属性struct
s,以及类型和生命周期。 也称为 “const generics”。例如,您现在可以编写以下内容。注意:目前仅允许使用原始整数、bool
或 char
类型的值。
-Csplit-debuginfo
codegen 选项。 此选项控制调试信息是拆分到多个文件还是打包到一个文件中。注意 此选项在其他平台上是不稳定的。aarch64_be-unknown-linux-gnu
, aarch64-unknown-linux-gnu_ilp32
, 和 aarch64_be-unknown-linux-gnu_ilp32
targets 添加了 tier 3* 支持。i386-unknown-linux-gnu
和 i486-unknown-linux-gnu
targets 添加了 tier 3 支持。target-cpu=native
选项现在将检测 CPU 的 individual features。* 有关 Rust 分层平台支持的更多信息,请参阅 Rust 的 平台支持页面。
Box::downcast
现在也为任何 dyn Any + Send + Sync
对象实现。str
现在实现了 AsMut<str>
。u64
和 u128
现在实现了 From<char>
。Error
现在为 &T
实现,其中 T
实现了 Error
。Poll::{map_ok, map_err}
现在为 Poll<Option<Result<T, E>>>
实现。unsigned_abs
现在为所有 signed integer 类型实现。io::Empty
现在实现了 io::Seek
。rc::Weak<T>
和 sync::Weak<T>
的方法(例如 as_ptr
)现在为 T: ?Sized
类型实现。Div
和 Rem
by their NonZero
variant 现在为所有 unsigned integers 实现。Arc::decrement_strong_count
Arc::increment_strong_count
Once::call_once_force
Peekable::next_if_eq
Peekable::next_if
Seek::stream_position
array::IntoIter
panic::panic_any
ptr::addr_of!
ptr::addr_of_mut!
slice::fill_with
slice::split_inclusive_mut
slice::split_inclusive
slice::strip_prefix
slice::strip_suffix
str::split_inclusive
sync::OnceState
task::Wake
VecDeque::range
VecDeque::range_mut
split-debuginfo
profile 选项来控制 -Csplit-debuginfo codegen 选项。Cargo.toml
添加了 resolver
字段,以启用新的 feature resolver 和 CLI option behavior。 Feature resolver 的版本 2 将尝试避免统一 dependencies 的 features,在不需要统一的情况下。例如,在 build scripts 和 proc-macros 中使用带有 std
feature 的相同 dependency,同时在最终二进制文件中使用 no-std
feature。有关该 feature 的更多信息,请参阅 Cargo book 文档。对文档内链接的各种改进
wasm-bindgen
ABI,而是使用 wasm32 ABI。rustc
不再将可能失败的 division、modulo 和 indexing 操作提升为 const
。armv5te-unknown-linux-gnueabi
sparc64-unknown-linux-gnu
thumbv7neon-unknown-linux-gnueabihf
armv7-unknown-linux-gnueabi
x86_64-unknown-linux-gnux32
atomic::spin_loop_hint
已被弃用。 建议改用 hint::spin_loop
。[x; N]
数组表达式中使用 const
值作为 x
。 自 1.38.0 以来,这在技术上是可能的,因为它被意外地稳定化了。ManuallyDrop<T>
union 字段的赋值现在被认为是安全的。armv5te-unknown-linux-uclibceabi
target 添加了 tier 3* 支持。aarch64-apple-ios-macabi
target 添加了 tier 3 支持。x86_64-unknown-freebsd
现在使用完整的 toolset 构建。* 有关 Rust 分层平台支持的更多信息,请参阅 Rust 的 平台支持页面。
proc_macro::Punct
现在实现了 PartialEq<char>
。ops::{Index, IndexMut}
现在为任何长度的 fixed sized arrays 实现。std::fs::File
类型现在具有 -1
的 “niche”。 此值不能是有效的文件描述符,现在意味着 Option<File>
占用与 File
相同的空间量。bool::then
btree_map::Entry::or_insert_with_key
f32::clamp
f64::clamp
hash_map::Entry::or_insert_with_key
Ord::clamp
RefCell::take
slice::fill
UnsafeCell::get_mut
以下以前稳定的方法现在是 const
。
IpAddr::is_ipv4
IpAddr::is_ipv6
IpAddr::is_unspecified
IpAddr::is_loopback
IpAddr::is_multicast
Ipv4Addr::octets
Ipv4Addr::is_loopback
Ipv4Addr::is_private
Ipv4Addr::is_link_local
Ipv4Addr::is_multicast
Ipv4Addr::is_broadcast
Ipv4Addr::is_documentation
Ipv4Addr::to_ipv6_compatible
Ipv4Addr::to_ipv6_mapped
Ipv6Addr::segments
Ipv6Addr::is_unspecified
Ipv6Addr::is_loopback
Ipv6Addr::is_multicast
Ipv6Addr::to_ipv4
Layout::size
Layout::align
Layout::from_size_align
pow
。checked_pow
。saturating_pow
。wrapping_pow
。next_power_of_two
。checked_next_power_of_two
。[build.rustc-workspace-wrapper]
选项。 此选项设置一个 wrapper 来执行,而不是 rustc
,仅适用于 workspace members。cargo:rerun-if-changed
现在,如果提供一个目录,将扫描该目录的整个内容以查找更改。cargo update
命令添加了 --workspace
flag。compare_and_swap
方法已被弃用。 建议改用 compare_exchange
和 compare_exchange_weak
方法。TokenStream
s 的检查方式的更改修复了一些您可以编写 unhygenic macro_rules!
macros 的情况。#![test]
现在被认为是不稳定的,并通过 soft_unstable
lint 报告错误(默认情况下)。forbid
lint 的同一级别覆盖它现在是一个 hard error。panic!
调用。 建议使用 #[panic_handler]
attribute 来提供您自己的实现。struct Foo {};
) 后的分号现在会产生 warning。Drop
,并且您现在可以在 union 中拥有带有 ManuallyDrop<T>
的字段。aarch64-unknown-linux-gnu
添加了 tier 1* 支持。aarch64-apple-darwin
添加了 tier 2 支持。aarch64-pc-windows-msvc
添加了 tier 2 支持。mipsel-unknown-none
添加了 tier 3 支持。* 有关 Rust 分层平台支持的更多信息,请参阅 Rust 的 平台支持页面。
以下以前稳定的方法现在是 const
。
cargo-package
构建 crate 现在应该是独立可重现的。cargo-tree
现在标记 proc-macro crates。CARGO_PRIMARY_PACKAGE
build-time 环境变量。 如果正在构建的 crate 是用户选择构建的 crate 之一(通过 -p
或通过默认设置),则将设置此变量。i686-unknown-freebsd
从 host tier 2 降级为 target tier 2 支持。这些更改不提供直接面向用户的好处,但代表了对 rustc 和相关工具的内部结构和整体性能的重大改进。
initial-exec
Thread Local Storage 模型编译。llvm-libunwind
bootstrap config 选项添加了 system
。--color
。unsafe
关键字现在在语法上允许用于 modules。 这在语义上仍然被拒绝,但现在可以被 procedural macros 解析。-C link-self-contained=<yes|no>
编译器 flag。 这告诉 rustc
是否链接它自己的 C runtime 和库,还是依赖外部 linker 来找到它们。(仅在 windows-gnu
, linux-musl
, 和 wasi
平台上支持。)linux-gnu
targets 上使用 -C target-feature=+crt-static
。 注意:如果您正在使用 cargo,则必须显式传递 --target
flag。aarch64-unknown-linux-musl
添加了 tier 2* 支持。* 有关 Rust 分层平台支持的更多信息,请参阅 Rust 的 平台支持页面。
io::Write
现在为 &ChildStdin
&Sink
, &Stdout
, 和 &Stderr
实现。TryFrom<Vec<T>>
。matches!
宏现在支持带有 trailing comma。Vec<A>
现在实现了 PartialEq<[B]>
,其中 A: PartialEq<B>
。RefCell::{replace, replace_with, clone}
方法现在都使用 #[track_caller]
。以下以前稳定的方法现在是 const fn
’s
Option::is_some
Option::is_none
Option::as_ref
Result::is_ok
Result::is_err
Result::as_ref
Ordering::reverse
Ordering::then
rustdoc
中的 items。 例如,/// Uses [`std::future`]
将自动生成指向 std::future
文档的链接。有关更多信息,请参阅 “Linking to items by name”。#[doc(alias = "<alias>")]
,以便在通过 rustdoc
的 UI 进行搜索时添加搜索别名。const fn
内部,对 'static
生命周期 references 的提升现在遵循与 fn
body 内部相同的规则。 特别是,在 const fn
中,&foo()
将不再被提升为 'static
生命周期。&mut
对 non zero-sized types 的 references 不再被提升。rustc
现在会发出警告,如果您在 #[link_name]
或 #[cold]
等属性不起作用的地方使用它们。arch::{x86, x86_64}
中的 _mm256_extract_epi8
和 _mm256_extract_epi16
签名,使其返回 i32
以匹配供应商签名。mem::uninitialized
现在会 panic。#[target_feature]
没有效果的地方使用它,现在会报错。catch_unwind
捕获,并导致程序中止。 注意:此行为不保证,并且仍然被认为是未定义行为,请参阅 catch_unwind
文档以获取更多信息。这些更改不提供直接面向用户的好处,但代表了对 rustc 和相关工具的内部结构和整体性能的重大改进。
ninja
而不是 make
从源代码构建 rustc
。 您可以通过在 config.toml
中设置 ninja=false
来继续使用 make
构建。uncached_llvm_type
中更少的名称ensure_sufficient_stack()
非泛型-C control-flow-guard
代码生成选项,该选项为 Windows 平台启用了 Control Flow Guard,并在其他平台上被忽略。thumbv4t-none-eabi
目标添加了 tier 3* 支持。RUST_BACKTRACE
的输出现在更紧凑。* 有关 Rust 分层平台支持的更多信息,请参阅 Rust 的 平台支持页面。
CStr
现在实现了 Index<RangeFrom<usize>>
。std
/core
中的 trait 现在为任意长度的数组实现,而不仅仅是长度小于 33 的数组。ops::RangeFull
和 ops::Range
现在实现了 Default。panic::Location
现在实现了 Copy
、Clone
、Eq
、Hash
、Ord
、PartialEq
和 PartialOrd
。Ident::new_raw
Range::is_empty
RangeInclusive::is_empty
Result::as_deref
Result::as_deref_mut
Vec::leak
pointer::offset_from
f32::TAU
f64::TAU
以下先前稳定的 API 现在已设为 const。
NonZero
整数的 new
方法。checked_add
,checked_sub
,checked_mul
,checked_neg
, checked_shl
, checked_shr
, saturating_add
, saturating_sub
和 saturating_mul
方法。checked_abs
, saturating_abs
, saturating_neg
和 signum
方法。char
和 u8
的 is_ascii_alphabetic
, is_ascii_uppercase
, is_ascii_lowercase
, is_ascii_alphanumeric
, is_ascii_digit
, is_ascii_hexdigit
, is_ascii_punctuation
, is_ascii_graphic
, is_ascii_whitespace
和 is_ascii_control
方法。opt-level 0
构建 build-dependencies
。 您可以通过在 Cargo.toml
中设置以下内容来覆盖此设置。[profile.release.build-override]
opt-level = 3
cargo-help
现在将为命令显示 man 手册,而不仅仅是 --help
文本。cargo-metadata
现在发出一个 test
字段,指示目标是否启用了测试。workspace.default-members
现在遵循 workspace.exclude
。cargo-publish
是在 package.publish
中指定的唯一注册表,则现在默认使用备用注册表。{} && false
的回归。macro_rules!
中 proc-macro 的扩展方式进行了更改,这应该有助于保留更多的 span 信息。 如果您的宏不卫生或未正确处理 Delimiter::None
,这些更改可能会导致编译错误。linux-gnu
目标现在需要最低内核 2.6.32 和 glibc 2.11。rustc-docs
组件。 这允许您安装和阅读编译器内部 API 的文档。(目前仅适用于 x86_64-unknown-linux-gnu
。)x.py
中引导程序的默认设置。 您可以在 Inside Rust 博客上的 “Changes to x.py
defaults” 文章中阅读有关此更改的详细信息。if
、match
和 loop
表达式现在可以在 const 函数中使用。&[T]
)。#[track_caller]
属性添加到函数,以使用函数的调用者的位置信息来生成 panic 消息。x.0.0
而不是 (x.0).0
。mem::transmute
现在可以在 statics 和 constants 中使用。 注意 您目前不能在常量函数中使用 mem::transmute
。cdylib
目标。x86_64-unknown-linux-musl
启用了静态 “Position Independent Executables”(位置无关可执行文件)。mem::forget
现在是一个 const fn
。String
现在实现了 From<char>
。leading_ones
和 trailing_ones
方法已为所有整数类型稳定化。vec::IntoIter<T>
现在实现了 AsRef<[T]>
。NonZeroU8
) 现在为其可零化等效类型实现 TryFrom
(例如 TryFrom<u8>
)。&[T]
和 &mut [T]
现在实现了 PartialEq<Vec<T>>
。(String, u16)
现在实现了 ToSocketAddrs
。vec::Drain<'_, T>
现在实现了 AsRef<[T]>
。添加了许多新的环境变量,这些变量在编译 crate 时可用。
CARGO_BIN_NAME
和 CARGO_CRATE_NAME
提供正在编译的特定二进制文件的名称和 crate 的名称。CARGO_PKG_LICENSE
包清单中的许可证。CARGO_PKG_LICENSE_FILE
许可证文件的路径。abi_blacklist
已重命名为 unsupported_abis
。 旧名称仍将继续有效。Drop
的类 C 枚举,Rustc 现在会发出警告。 这以前是被接受的,但在未来的版本中将成为硬错误。#[repr(i128)]
或 #[repr(u128)]
,Rustc 将无法编译。 此表示形式目前仅允许在枚举上使用。macro_rules!
的 tokens 现在始终被捕获。 这有助于确保 span 具有正确的信息,如果您依赖于接收带有虚拟信息的 span,则可能会导致破坏。{f32, f64}::asinh
现在为负数返回正确的值。libz
(也称为 zlib
)。 即使我们期望它在大多数系统上已经可用,也需要安装该库才能使 rustc
工作。#[should_panic]
注释的测试在 ARMv7 上已损坏。rustc
的美化打印返回的确切输出是一个不稳定的实现细节:我们建议任何依赖它的宏切换到更强大的解析系统。as
进行超出范围的浮点数到整数的转换已被定义为饱和转换。 这以前是未定义的行为,但您可以使用 {f64, f32}::to_int_unchecked
方法继续使用当前行为,这在罕见的性能敏感情况下可能是可取的。mem::Discriminant<T>
现在使用 T
的 discriminant 类型,而不是总是使用 u64
。macro_rules!
) 宏的任何地方使用类似函数的程序宏。target-feature
标志覆盖单个目标特性。 例如,-C target-feature=+avx2 -C target-feature=+fma
现在等效于 -C target-feature=+avx2,+fma
。force-unwind-tables
标志。 此选项允许 rustc
始终生成 unwind 表,而与 panic 策略无关。embed-bitcode
标志。 此代码生成标志允许 rustc
将 LLVM bitcode 包含到生成的 rlib
中(默认情况下已启用)。code-model
代码生成标志添加了 tiny
值。mipsel-sony-psp
目标添加了 tier 3 支持*。thumbv7a-uwp-windows-msvc
目标添加了 tier 3 支持。* 有关 Rust 分层平台支持的更多信息,请参阅 Rust 的 平台支持页面。
net::{SocketAddr, SocketAddrV4, SocketAddrV6}
现在实现了 PartialOrd
和 Ord
。proc_macro::TokenStream
现在实现了 Default
。char
与 ops::{Range, RangeFrom, RangeFull, RangeInclusive, RangeTo}
一起使用,以迭代 codepoint 的范围。 例如,您现在可以编写以下内容;
OsString
现在实现了 FromStr
。saturating_neg
方法已添加到所有有符号整数基本类型,并且 saturating_abs
方法已添加到所有整数基本类型。T
为 [T: Copy]
、str
、CStr
、OsStr
或 Path
时,Arc<T>
、Rc<T>
现在实现了 From<Cow<'_, T>>
,并且 Box
现在实现了 From<Cow>
。Box<[T]>
现在实现了 From<[T; N]>
。BitOr
和 BitOrAssign
为所有 NonZero
整数类型实现。fetch_min
和 fetch_max
方法已添加到所有原子整数类型。fetch_update
方法已添加到所有原子整数类型。Arc::as_ptr
BTreeMap::remove_entry
Rc::as_ptr
rc::Weak::as_ptr
rc::Weak::from_raw
rc::Weak::into_raw
str::strip_prefix
str::strip_suffix
sync::Weak::as_ptr
sync::Weak::from_raw
sync::Weak::into_raw
char::UNICODE_VERSION
Span::resolved_at
Span::located_at
Span::mixed_site
unix::process::CommandExt::arg0
~~outdated information~~
变为 “{f32, f64}::powi
现在在 Windows 上返回略有不同的值。 这是由于 {f32, f64}::powi
使用的 LLVM intrinsics 中的更改所致。lto
标志与新的 embed-bitcode=no
不兼容。 如果在 cargo 自身添加 embed-bitcode
时,通过 RUSTFLAGS
或 cargo rustc
标志启用了 LTO,则可能会导致问题。控制 LTO 的推荐方法是使用 Cargo profiles,可以在 Cargo.toml
或 .cargo/config
中设置,或者在环境中设置 CARGO_PROFILE_<name>_LTO
。仅语法更改
这些更改在语义上仍然被拒绝,因此您可能会收到错误,但宏和条件编译可以看到和解析这些更改。
-C codegen-units
标志。 此外,在增量模式下,rustc 默认为 256 个代码生成单元。catch_unwind
以实现零成本,除非启用了 unwinding 并且抛出了 panic。aarch64-unknown-none
和 aarch64-unknown-none-softfloat
目标添加了 tier 3* 支持。arm64-apple-tvos
和 x86_64-apple-tvos
目标添加了 tier 3 支持。vec![]
以直接映射到 Vec::new()
。 这允许 vec![]
能够在 const 上下文中使用。convert::Infallible
现在实现了 Hash
。OsString
现在实现了 DerefMut
和 IndexMut
,返回 &mut OsStr
。String
现在实现了 From<&mut str>
。IoSlice
现在实现了 Copy
。Vec<T>
现在实现了 From<[T; N]>
。 其中 N
最大为 32。proc_macro::LexError
现在实现了 fmt::Display
和 Error
。from_le_bytes
、to_le_bytes
、from_be_bytes
、to_be_bytes
、from_ne_bytes
和 to_ne_bytes
方法现在对于所有整数类型都是 const
的。PathBuf::with_capacity
PathBuf::capacity
PathBuf::clear
PathBuf::reserve
PathBuf::reserve_exact
PathBuf::shrink_to_fit
f32::to_int_unchecked
f64::to_int_unchecked
Layout::align_to
Layout::pad_to_align
Layout::array
Layout::extend
cargo tree
命令,该命令将打印您的依赖项的树形图。 例如: mdbook v0.3.2 (/Users/src/rust/mdbook)
├── ammonia v3.0.0
│ ├── html5ever v0.24.0
│ │ ├── log v0.4.8
│ │ │ └── cfg-if v0.1.9
│ │ ├── mac v0.1.1
│ │ └── markup5ever v0.9.0
│ │ ├── log v0.4.8 (*)
│ │ ├── phf v0.7.24
│ │ │ └── phf_shared v0.7.24
│ │ │ ├── siphasher v0.2.3
│ │ │ └── unicase v1.4.2
│ │ │ [build-dependencies]
│ │ │ └── version_check v0.1.5
...
cargo tree -d
(cargo tree --duplicates
的缩写)显示同一 crate 的多个版本的依赖项。.a
的静态库,而不是以前的 .lib
。-C no_integrated_as
标志。file_name
属性现在指向实际的源文件,而不是以前的 <NAME macros>
格式。 注意: 这可能不指向用户系统上实际存在的文件。NonZeroU8
)一起使用时,mem::{zeroed, uninitialised}
现在会 panic。 这以前是一个警告。as
运算符将 f64
转换为 u32
已被定义为饱和操作。 这以前是未定义的行为,但您可以使用 {f64, f32}::to_int_unchecked
方法继续使用当前行为,这在罕见的性能敏感情况下可能是可取的。这些更改不提供直接面向用户的好处,但代表了对 rustc 和相关工具的内部结构和整体性能的重大改进。
cargo package --list
不适用于未发布的依赖项的问题。仅语法更改
type Foo: Ord
。fn
上下文中使用 self
。fn
语法 + 清理项解析。item
宏片段可以插入到 trait
、impl
和 extern
代码块中。 例如,您现在可以编写
这些更改在语义上仍然被拒绝,因此您可能会收到错误,但宏和条件编译可以看到和解析这些更改。
rustc -D unused -A unused-variables
拒绝 unused
lint 组中的所有内容,但显式允许 unused-variables
除外。但是,传递 rustc -A unused-variables -D unused
会拒绝 unused
lint 组中的所有内容,包括 unused-variables
,因为 allow 标志在 deny 标志之前指定(因此被覆盖)。windows-gnu
上可用,则 rustc 现在将优先使用它们,而不是其捆绑的库。Arc<[T; N]>
、Box<[T; N]>
和 Rc<[T; N]>
现在分别实现了 TryFrom<Arc<[T]>>
、TryFrom<Box<[T]>>
和 TryFrom<Rc<[T]>>
。 注意 这些转换仅在 N
为 0..=32
时可用。u32::MAX
或 f32::NAN
而无需导入。u8::is_ascii
现在是 const
。String
现在实现了 AsMut<str>
。std
和 core
添加了 primitive
模块。 此模块重新导出 Rust 的原始类型。这主要在您想避免这些类型被 shadow 的宏中很有用。HashMap
和 HashSet
上的一些 trait bounds。string::FromUtf8Error
现在实现了 Clone + Eq
。.cargo/config
中或通过您的环境设置 config [profile]
。CARGO_BIN_EXE_<name>
,指向二进制文件的可执行路径。 <name>
是您的二进制文件的原样名称。例如,如果您想要名为 my-program
的二进制文件的可执行路径,您将使用 env!("CARGO_BIN_EXE_my-program")
。const_err
lint 中的某些检查被认为与 const evaluation 无关,并且已移至 unconditional_panic
和 arithmetic_overflow
lints。assert!
宏中具有尾随语法现在是一个硬错误。 自 1.36.0 以来,这已是一个警告。Self
没有正确推断类型的问题。 这错误地导致某些实例被接受,现在正确地发出硬错误。这些更改没有提供直接面向用户的好处,但代表了 rustc
和相关工具的内部结构和整体性能的重大改进。
opt-level=3
而不是 2
构建。#[inline]
某些热函数的性能。Drop
终止符您现在可以在 univariant 枚举上使用 #[repr(transparent)]
。 这意味着您可以创建一个枚举,该枚举具有与其包含的类型完全相同的布局和 ABI。
trait
定义中,default
在项之前在语法上是允许的。impl
中的项(即 const
、type
和 fn
)可以在语法上省略其主体,而使用 ;
代替。impl
中关联类型的 bounds(例如 type Foo: Ord;
)。...
(C-可变参数类型) 可能在语法上直接作为任何函数参数的类型出现。这些更改在语义上仍然被拒绝,因此您可能会收到错误,但程序宏和条件编译可以看到和解析这些更改。
armv7a-none-eabi
添加了 tier 2* 支持。riscv64gc-unknown-linux-gnu
添加了 tier 2 支持。Option::{expect,unwrap}
和 Result::{expect, expect_err, unwrap, unwrap_err}
现在生成指向它们被调用位置的 panic 消息,而不是 core 的内部位置。* 有关 Rust 分层平台支持的更多信息,请参阅 Rust 的 平台支持页面。
iter::Empty<T>
现在为任何 T
实现 Send
和 Sync
。Pin::{map_unchecked, map_unchecked_mut}
不再要求返回类型实现 Sized
。io::Cursor
现在派生自 PartialEq
和 Eq
。Layout::new
现在是 const
。riscv64gc-unknown-linux-gnu
添加了标准库支持。CondVar::wait_while
CondVar::wait_timeout_while
DebugMap::key
DebugMap::value
ManuallyDrop::take
matches!
ptr::slice_from_raw_parts_mut
ptr::slice_from_raw_parts
Error::description
已被弃用,其使用现在将产生警告。 建议改用 Display
/to_string
。Copy
impls 的 lifetime boundsLayout::repeat
调用者中的错误编译impl<T> From<Foo> for Vec<T> {}
。self
位置任意嵌套接收者类型了。 例如,现在可以写 fn foo(self: Box<Box<Self>>) {}
。 之前只允许 Self
、&Self
、&mut Self
、Arc<Self>
、Rc<Self>
和 Box<Self>
。format_args
宏中使用任何有效的标识符了。 之前不允许以下划线开头的标识符。pub
) 现在在语法上允许用于 trait 项和 enum 变体。 这些在语义上仍然被拒绝,但可以被过程宏和条件编译看到和解析。Box<T>
的 Rust extern "C"
函数,并在 C 端使用 T*
作为相应的类型。 请参阅 文档 以获取更多信息,包括关于在 C 中定义的函数的 Rust 签名中避免使用 Box<T>
的重要注意事项。'label
,Rustc 现在会发出警告。i686-unknown-dragonfly
目标的支持。riscv64gc-unknown-linux-gnu
目标添加了 Tier 3 支持*。@path
语法传递给 rustc 来传递参数文件。 请注意,此格式与其他工具中的格式略有不同;请参阅 文档 以获取更多信息。--extern
标志,表示它可以从搜索路径中获得,或者使用 -L
标志指定。* 有关 Rust 分层平台支持的更多信息,请参阅 Rust 的 平台支持页面。
core::panic
模块现在是稳定的。 它已经通过 std
变得稳定。NonZero*
数值类型是较小的整数宽度,则现在实现了 From<NonZero*>
。 例如,NonZeroU16
现在实现了 From<NonZeroU8>
。MaybeUninit<T>
现在实现了 fmt::Debug
。Result::map_or
Result::map_or_else
std::rc::Weak::weak_count
std::rc::Weak::strong_count
std::sync::Weak::weak_count
std::sync::Weak::strong_count
cargo-install
如果检测到软件包已过期,现在将重新安装它。[profile.dev.package.image] opt-level = 2
将 image
crate 的优化级别设置为调试构建的 2
。 也可以使用 [profile.<profile>.build-override]
来覆盖构建脚本及其依赖项。edition
以针对该 edition 编译代码块。 例如,edition2018
告诉 rustdoc 代码示例应该针对 Rust 2018 edition 编译。--theme
为 rustdoc 提供自定义主题,并使用 --check-theme
检查当前主题。#[cfg(doc)]
在构建文档时编译项。现在可以使用 #[non_exhaustive]
属性标记 struct
、enum
和 enum
变体,以表明将来可能会添加变体或字段。 例如,这需要在非穷尽的 enum
的任何 match 语句中添加通配符分支 (_ => {}
)。 (RFC 2008)
现在可以在 extern
代码块和类型位置中使用函数式过程宏了。 例如:type Generated = macro!();
macro_rules!
中的 meta
模式匹配器现在可以正确匹配现代属性语法。 例如,(#[$m:meta])
现在可以匹配 #[attr]
、#[attr{tokens}]
、#[attr[tokens]]
和 #[attr(tokens)]
。
thumbv7neon-unknown-linux-musleabihf
目标添加了 Tier 3 支持*。aarch64-unknown-none-softfloat
目标添加了 Tier 3 支持。mips64-unknown-linux-muslabi64
和 mips64el-unknown-linux-muslabi64
目标添加了 Tier 3 支持。* 有关 Rust 分层平台支持的更多信息,请参阅 Rust 的 平台支持页面。
BTreeMap::get_key_value
HashMap::get_key_value
Option::as_deref_mut
Option::as_deref
Option::flatten
UdpSocket::peer_addr
f32::to_be_bytes
f32::to_le_bytes
f32::to_ne_bytes
f64::to_be_bytes
f64::to_le_bytes
f64::to_ne_bytes
f32::from_be_bytes
f32::from_le_bytes
f32::from_ne_bytes
f64::from_be_bytes
f64::from_le_bytes
f64::from_ne_bytes
mem::take
slice::repeat
todo!
--all-features
除外)现在会产生错误。 以前这些标志会被忽略。version
的 dev-dependencies
。include!
宏未能包含整个文件,现在会发出警告。 include!
宏无意中只包含文件中的第一个表达式,这可能不直观。 在未来的版本中,这将变成硬错误,或者行为可能会修复为按预期包含所有表达式。#[inline]
现在会在 unused_attribute
lint 下发出警告。 在 trait 或 extern
代码块内的任何其他位置使用 #[inline]
现在会正确地发出硬错误。async fn
、async move {}
和 async {}
分别创建 async
函数和代码块,并且现在可以对 async 表达式调用 .await
。cfg
、cfg_attr
、allow
、warn
、deny
、forbid
以及应用于项的过程宏属性使用的惰性辅助属性。 例如:
match
分支的 if
守卫中获取对按移动绑定模式的共享引用。 例如:fn main() {
let array: Box<[u8; 4]> = Box::new([1, 2, 3, 4]);
match array {
nums
// ---- `nums` is bound by move.
if nums.iter().sum::<u8>() == 10
// ^------ `.iter()` implicitly takes a reference to `nums`.
=> {
drop(nums);
// ----------- Legal as `nums` was bound by move and so we have ownership.
}
_ => unreachable!(),
}
}
i686-unknown-uefi
目标添加了 Tier 3* 支持。sparc64-unknown-openbsd
目标添加了 Tier 3 支持。--show-output
参数,以打印成功测试的输出。* 有关 Rust 分层平台支持的更多信息,请参阅 Rust 的 平台支持页面。
Vec::new
和 String::new
现在是 const
函数。LinkedList::new
现在是一个 const
函数。str::len
、[T]::len
和 str::as_bytes
现在是 const
函数。abs
、wrapping_abs
和 overflowing_abs
数值函数现在是 const
。version
,现在可以发布 git 依赖项。--all
标志已重命名为 --workspace
。 使用 --all
现在已弃用。rustdoc
现在需要安装 rustc
并在同一目录中运行测试。 这应该可以提高运行大量 doctest 时的性能。try!
宏现在将发出弃用警告。 建议改用 ?
运算符。asinh(-0.0)
现在可以正确返回 -0.0
。 之前这会返回 0.0
。rustc
添加了流水线编译支持。 这将在某些情况下提高编译时间。 有关更多信息,请参阅 “Evaluating pipelined rustc compilation” 帖子。aarch64-uwp-windows-msvc
、i686-uwp-windows-gnu
、i686-uwp-windows-msvc
、x86_64-uwp-windows-gnu
和 x86_64-uwp-windows-msvc
目标添加了 Tier 3* 支持。armv7-unknown-linux-gnueabi
和 armv7-unknown-linux-musleabi
目标添加了 Tier 3 支持。hexagon-unknown-linux-musl
目标添加了 Tier 3 支持。riscv32i-unknown-none-elf
目标添加了 Tier 3 支持。* 有关 Rust 分层平台支持的更多信息,请参阅 Rust 的 平台支持页面。
ascii::EscapeDefault
现在实现了 Clone
和 Display
。Clone
、Debug
、Hash
)的派生宏现在在与特征相同的路径下可用。 (例如,Clone
派生宏在 std::clone::Clone
中可用)。 这也使所有内置宏在 std
/core
根目录下可用。 例如 std::include_bytes!
。str::Chars
现在实现了 Debug
。slice::{concat, connect, join}
除了 &T
之外,现在还接受 &[T]
。*const T
和 *mut T
现在实现了 marker::Unpin
。Arc<[T]>
和 Rc<[T]>
现在实现了 FromIterator<T>
。div_euclid
、rem_euclid
)。 此外,所有整数原始类型都提供了 checked
、overflowing
和 wrapping
版本。thread::AccessError
现在实现了 Clone
、Copy
、Eq
、Error
和 PartialEq
。iter::{StepBy, Peekable, Take}
现在实现了 DoubleEndedIterator
。<*const T>::cast
<*mut T>::cast
Duration::as_secs_f32
Duration::as_secs_f64
Duration::div_f32
Duration::div_f64
Duration::from_secs_f32
Duration::from_secs_f64
Duration::mul_f32
Duration::mul_f64
any::type_name
x86_64-unknown-uefi
平台无法使用 rustc 1.38.0 构建。armv7-unknown-linux-gnueabihf
平台在某些 crate(例如 libc)中存在问题。#[must_use]
的类型包含在 元组、 Box
或 数组 中且未使用,则现在会发出警告。cfg
和 cfg_attr
属性。_
作为 consts 的标识符。 例如,您可以编写 const _: u32 = 5;
。#[repr(align(X)]
。?
Kleene 宏运算符现在在 2015 edition 中可用。-C profile-generate
和 -C profile-use
标志启用 Profile-Guided Optimization(PGO,即性能剖析引导优化)。 有关如何使用性能剖析引导优化的更多信息,请参阅 rustc book。rust-lldb
包装脚本现在应该可以再次工作了。BufReader::buffer
BufWriter::buffer
Cell::from_mut
Cell<[T]>::as_slice_of_cells
DoubleEndedIterator::nth_back
Option::xor
Wrapping::reverse_bits
i128::reverse_bits
i16::reverse_bits
i32::reverse_bits
i64::reverse_bits
i8::reverse_bits
isize::reverse_bits
slice::copy_within
u128::reverse_bits
u16::reverse_bits
u32::reverse_bits
u64::reverse_bits
u8::reverse_bits
usize::reverse_bits
Cargo.lock
文件。[package]
中指定 default-run="foo"
,以指定用于 cargo run
的默认可执行文件。...
进行包含范围模式现在会发出警告。 请将您的代码转换为使用 ..=
语法来代替包含范围。dyn
的情况下使用 trait 对象现在会发出警告。 请将您的代码转换为使用 dyn Trait
来代替 trait 对象。dyn Send + fmt::Debug
现在等同于 dyn fmt::Debug + Send
,而以前并非如此。HashMap
的实现已替换为 hashbrown::HashMap
实现。TryFromSliceError
现在实现了 From<Infallible>
。mem::needs_drop
现在可用作 const fn。alloc::Layout::from_size_align_unchecked
现在可用作 const fn。String
现在实现了 BorrowMut<str>
。io::Cursor
现在实现了 Default
。NonNull::{dangling, cast}
现在都是 const fns。alloc
crate 现在是稳定的。 如果环境可以访问堆内存分配,alloc
允许您在 #![no_std]
环境中使用 std
的子集(例如 Vec
、Box
、Arc
)。String
现在实现了 From<&String>
。dbg!
宏传递多个参数。 当有多个参数时,dbg!
将返回每个参数的元组。Result::{is_err, is_ok}
现在是 #[must_use]
,如果未使用,将产生警告。VecDeque::rotate_left
VecDeque::rotate_right
Iterator::copied
io::IoSlice
io::IoSliceMut
Read::read_vectored
Write::write_vectored
str::as_mut_ptr
mem::MaybeUninit
pointer::align_offset
future::Future
task::Context
task::RawWaker
task::RawWakerVTable
task::Waker
task::Poll
您可以在 Cargo 1.36.0 发行说明 中找到更多更改。
Clippy 进行了许多添加和修复,有关更多详细信息,请参阅 Clippy 1.36.0 发行说明。
mem::MaybeUninit
的稳定,不再建议使用 mem::uninitialized
,并且将在 1.39.0 中弃用。armv6-unknown-freebsd-gnueabihf
和 armv7-unknown-freebsd-gnueabihf
目标。wasm32-unknown-wasi
目标。Thread
现在将在 Debug
输出中显示其 ID。StdinLock
、StdoutLock
和 StderrLock
现在实现了 AsRawFd
。alloc::System
现在实现了 Default
。Debug
输出 ({:#?}
) 现在在最后一个字段上带有尾随逗号。char::{ToLowercase, ToUppercase}
现在实现了 ExactSizeIterator
。NonZero
数值类型现在都实现了 FromStr
。BufReader::{get_ref, get_mut, into_inner}
方法上的 Read
特征约束。dbg!
宏,以打印调用它的文件和行号。str::make_ascii_lowercase
hash_map::{OccupiedEntry, VacantEntry}
现在实现了 Sync
和 Send
。f32::copysign
f64::copysign
RefCell::replace_with
RefCell::map_split
ptr::hash
Range::contains
RangeFrom::contains
RangeTo::contains
RangeInclusive::contains
RangeToInclusive::contains
Option::copied
redundant_closure
Clippy lint 的误报missing_const_for_fn
Clippy lint 的误报#[deprecated = "reason"]
作为 #[deprecated(note = "reason")]
的简写形式。 这之前被错误地允许,但没有效果。#[attr()]
、#[attr[]]
和 #[attr{}]
过程宏中接受标记流。extern crate self as foo;
将您的 crate 根目录导入到外部 prelude 中。riscv64imac-unknown-none-elf
和 riscv64gc-unknown-none-elf
目标。-C linker-plugin-lto
启用链接器插件 LTO 优化。 这允许 rustc 将您的 Rust 代码编译为 LLVM 比特码,使 LLVM 能够跨 C/C++ FFI 边界执行 LTO 优化。powerpc64-unknown-freebsd
目标。HashMap<K, V, S>
和 HashSet<T, S>
的某些基本方法上的特征约束。 最值得注意的是,您不再需要 Hash
特征来创建迭代器。BinaryHeap<T>
的某些基本方法上的 Ord
特征约束。 最值得注意的是,您不再需要 Ord
特征来创建迭代器。overflowing_neg
和 wrapping_neg
现在是所有数值类型的 const
函数。str
现在对于所有实现 SliceIndex<str>
的类型都是通用的。str::trim
、str::trim_matches
、str::trim_{start, end}
和 str::trim_{start, end}_matches
现在是 #[must_use]
,如果它们的返回类型未使用,将产生警告。checked_pow
、saturating_pow
、wrapping_pow
和 overflowing_pow
现在可用于所有数值类型。 这些方法等效于 pow
运算的方法,例如 wrapping_add
。Any::type_id
Error::type_id
atomic::AtomicI16
atomic::AtomicI32
atomic::AtomicI64
atomic::AtomicI8
atomic::AtomicU16
atomic::AtomicU32
atomic::AtomicU64
atomic::AtomicU8
convert::Infallible
convert::TryFrom
convert::TryInto
iter::from_fn
iter::successors
num::NonZeroI128
num::NonZeroI16
num::NonZeroI32
num::NonZeroI64
num::NonZeroI8
num::NonZeroIsize
slice::sort_by_cached_key
str::escape_debug
str::escape_default
str::escape_unicode
str::split_ascii_whitespace
Command::before_exec
正在被不安全的方法 Command::pre_exec
替换,并且将在 Rust 1.37.0 中弃用。static
变量中使用 const
函数,因此使用 ATOMIC_{BOOL, ISIZE, USIZE}_INIT
现在已被弃用。cfg(target_vendor)
属性。 例如:#[cfg(target_vendor="apple")] fn main() { println!("Hello Apple!"); }
u8
上使用涵盖 0..=255
的 match 语句,并且不再需要 _ => unreachable!()
分支。if let
和 while let
表达式中使用多个模式。 您可以使用与 match
表达式相同的语法来执行此操作。 例如:
if let
和 while let
模式。 默认情况下,使用此功能会产生警告,因为此行为可能不直观。 例如:if let _ = 5 {}
let
绑定、赋值、表达式语句和不可反驳的模式解构。cfg_attr
属性中指定多个属性。 例如:#[cfg_attr(all(), must_use, optimize)]
#[repr(packed)]
属性指定特定的对齐方式。 例如:#[repr(packed(2))] struct Foo(i16, i32);
是一个对齐方式为 2 字节,大小为 6 字节的结构体。_
。 这允许您导入 trait 的 impls,而不在命名空间中包含该名称。 例如:
Rc
、Arc
和 Pin
用作方法接收器.-Clinker-flavor
命令行参数为 rustc
设置链接器风格。x86_64-fortanix-unknown-sgx
目标支持已升级到 tier 2 支持。 访问 平台支持 页面以获取有关 Rust 平台支持的信息。thumbv7neon-linux-androideabi
和 thumbv7neon-unknown-linux-gnueabihf
目标的支持。x86_64-unknown-uefi
目标的支持。overflowing_{add, sub, mul, shl, shr}
现在对于所有数字类型都是 const
函数。rotate_left
、rotate_right
和 wrapping_{add, sub, mul, shl, shr}
现在对于所有数字类型都是 const
函数。is_positive
和 is_negative
现在对于所有有符号数字类型都是 const
函数。NonZero
类型的 get
方法现在都是 const
。count_ones
、count_zeros
、leading_zeros
、trailing_zeros
、swap_bytes
、from_be
、from_le
、to_be
、to_le
现在对于所有数字类型都是 const
。Ipv4Addr::new
现在是一个 const
函数unix::FileExt::read_exact_at
unix::FileExt::write_all_at
Option::transpose
Result::transpose
convert::identity
pin::Pin
marker::Unpin
marker::PhantomPinned
Vec::resize_with
VecDeque::resize_with
Duration::as_millis
Duration::as_micros
Duration::as_nanos
cargo publish --features
或 cargo publish --all-features
。str::{trim_left, trim_right, trim_left_matches, trim_right_matches}
现在已被弃用,并且它们的使用现在会产生警告。请改用 str::{trim_start, trim_end, trim_start_matches, trim_end_matches}
方法。Error::cause
方法已被弃用,推荐使用支持向下转型的 Error::source
。--test-threads=1
时,Libtest 不再为每个测试创建新线程。它还以确定性顺序运行测试?
运算符。 ?
运算符允许您指定零个或一个重复项,类似于 *
和 +
运算符。super
、self
或 crate
)的模块路径,现在将始终解析为模块中可用的项(enum
、struct
等)(如果存在),然后再解析为外部 crate 或 prelude 中的项。 例如:
PhantomData<T>
类型。literal
说明符在宏中匹配字面量。 这将匹配任何类型的字面量。例如:1
、'A'
、"Hello World"
#[must_use]
标记 trait。 如果程序中返回了 impl Trait
或 dyn Trait
但未使用,这将提供警告。aarch64-pc-windows-msvc
目标。PathBuf
现在实现了 FromStr
。Box<[T]>
现在实现了 FromIterator<T>
。dbg!
宏已稳定化。 此宏使您能够轻松调试 Rust 程序中的表达式。例如:
以下 API 现在是 const
函数,可以在 const
上下文中使用。
Cell::as_ptr
UnsafeCell::get
char::is_ascii
iter::empty
ManuallyDrop::new
ManuallyDrop::into_inner
RangeInclusive::start
RangeInclusive::end
NonNull::as_ptr
slice::as_ptr
str::as_ptr
Duration::as_secs
Duration::subsec_millis
Duration::subsec_micros
Duration::subsec_nanos
CStr::as_ptr
Ipv4Addr::is_unspecified
Ipv6Addr::new
Ipv6Addr::octets
i8::to_be_bytes
i8::to_le_bytes
i8::to_ne_bytes
i8::from_be_bytes
i8::from_le_bytes
i8::from_ne_bytes
i16::to_be_bytes
i16::to_le_bytes
i16::to_ne_bytes
i16::from_be_bytes
i16::from_le_bytes
i16::from_ne_bytes
i32::to_be_bytes
i32::to_le_bytes
i32::to_ne_bytes
i32::from_be_bytes
i32::from_le_bytes
i32::from_ne_bytes
i64::to_be_bytes
i64::to_le_bytes
i64::to_ne_bytes
i64::from_be_bytes
i64::from_le_bytes
i64::from_ne_bytes
i128::to_be_bytes
i128::to_le_bytes
i128::to_ne_bytes
i128::from_be_bytes
i128::from_le_bytes
i128::from_ne_bytes
isize::to_be_bytes
isize::to_le_bytes
isize::to_ne_bytes
isize::from_be_bytes
isize::from_le_bytes
isize::from_ne_bytes
u8::to_be_bytes
u8::to_le_bytes
u8::to_ne_bytes
u8::from_be_bytes
u8::from_le_bytes
u8::from_ne_bytes
u16::to_be_bytes
u16::to_le_bytes
u16::to_ne_bytes
u16::from_be_bytes
u16::from_le_bytes
u16::from_ne_bytes
u32::to_be_bytes
u32::to_le_bytes
u32::to_ne_bytes
u32::from_be_bytes
u32::from_le_bytes
u32::from_ne_bytes
u64::to_be_bytes
u64::to_le_bytes
u64::to_ne_bytes
u64::from_be_bytes
u64::from_le_bytes
u64::from_ne_bytes
u128::to_be_bytes
u128::to_le_bytes
u128::to_ne_bytes
u128::from_be_bytes
u128::from_le_bytes
u128::from_ne_bytes
usize::to_be_bytes
usize::to_le_bytes
usize::to_ne_bytes
usize::from_be_bytes
usize::from_le_bytes
usize::from_ne_bytes
_mm256_stream_si256
、_mm256_stream_pd
、_mm256_stream_ps
的参数类型 已从 *const
更改为 *mut
,因为之前的实现不健全。impl<'a> Reader for BufReader<'a> {}
现在可以写成 impl Reader for BufReader<'_> {}
。生命周期仍然需要在结构体中定义。const
函数。 这些函数目前是 const fn RFC 的严格最小子集。有关具体可用功能的详细信息,请参阅 语言参考。#[allow(clippy::filter_map)]
。#[no_mangle]
和 #[export_name]
属性现在可以位于 crate 中的任何位置,而不仅仅是在导出的函数中。From
trait 将 num::NonZero*
类型转换为其原始等效类型。 例如:u8
现在实现了 From<NonZeroU8>
。From
trait 将 &Option<T>
转换为 Option<&T>
,并将 &mut Option<T>
转换为 Option<&mut T>
。time::Duration
乘以 (*
) u32
。slice::align_to
slice::align_to_mut
slice::chunks_exact
slice::chunks_exact_mut
slice::rchunks
slice::rchunks_mut
slice::rchunks_exact
slice::rchunks_exact_mut
Option::replace
r#
) 将关键字用作标识符, 例如:let r#for = true;
crate
。 这允许您在路径中引用 crate 根目录,例如:use crate::foo;
引用 src/lib.rs
中的 foo
。::
为前缀。 以前,在没有 use 语句的模块中使用外部 crate 需要 let json = ::serde_json::from_str(foo);
,但现在可以写成 let json = serde_json::from_str(foo);
。#[used]
属性应用于静态项,以防止编译器优化掉它们,即使它们看起来未使用, 例如:#[used] static FOO: u32 = 1;
use
语法从其他 crate 导入和重新导出宏。 使用 #[macro_export]
导出的宏现在放置在 crate 的根模块中。如果您的宏依赖于调用其他本地宏,建议使用 #[macro_export(local_inner_macros)]
属性导出,这样用户就不必导入这些宏。vis
说明符在宏中捕获可见性关键字(例如 pub
、pub(crate)
)。#[attr("true")]
,现在您可以编写 #[attr(true)]
。#[panic_handler]
属性指定一个函数来处理 Rust 运行时中的 panic。以下方法是 trim_left
、trim_right
、trim_left_matches
和 trim_right_matches
的替换方法,它们将在 1.33.0 版本中弃用
cargo run
在 workspace 中不需要指定包。cargo doc
现在支持 --message-format=json
。 这相当于调用 rustdoc --error-format=json
。rustdoc
允许您使用 --edition
选项指定将代码视为哪个版本。rustdoc
现在具有 --color
(指定是否输出颜色)和 --error-format
(指定错误格式,例如 json
)选项。rust-gdbgui
脚本,该脚本使用 Rust 调试符号调用 gdbgui
。rustfmt
或 clippy
)的属性现在可用, 例如:#[rustfmt::skip]
将跳过格式化下一个项。rls-preview
组件已恢复。标准库的 str::repeat
函数包含一个由整数溢出引起的越界写入。这已通过在发生溢出时确定性地 panic 来修复。
感谢 Scott McMurray 负责任地向我们披露此漏洞。
powerpc64le-unknown-linux-musl
目标。aarch64-unknown-hermit
和 x86_64-unknown-hermit
目标。Once::call_once
不再要求 Once
为 'static
。BuildHasherDefault
现在实现了 PartialEq
和 Eq
。Box<CStr>
、Box<OsStr>
和 Box<Path>
现在实现了 Clone
。OsString
实现了 PartialEq<&str>
,为 &str
实现了 PartialEq<OsString>
。Cell<T>
现在允许 T
为 unsized。SocketAddr
在 Redox 上现在是稳定的。--locked
禁用此行为。cargo-install
现在允许您使用 --target
交叉编译安装。cargo-fix
子命令,用于自动将项目代码从 2015 版本迁移到 2018 版本。cargo doc
现在可以使用 --document-private-items
标志选择性地记录私有类型。rustdoc
现在具有 --cap-lints
选项,该选项将所有高于指定级别的 lint 降级到该级别。 例如:--cap-lints warn
将把 deny
和 forbid
lint 降级为 warn
。rustc
和 rustdoc
现在将具有退出代码 1
,如果发生 panic,则退出代码为 101
。rustup component add clippy-preview
安装预览版。str::{slice_unchecked, slice_unchecked_mut}
现在已被弃用。 请改用 str::get_unchecked(begin..end)
。std::env::home_dir
由于其不直观的行为,现已被弃用。 考虑使用 https://crates.io/crates/dirs 中的 home_dir
函数代替。rustc
将不再静默忽略目标规范中的无效数据。cfg
属性和 --cfg
命令行标志现在经过更严格的验证。#[repr(transparent)]
属性现在是稳定的。 此属性允许 Rust newtype 包装器 (struct NewType<T>(T);
) 在跨越外部函数接口 (FFI) 边界时表示为内部类型。pure
、sizeof
、alignof
和 offsetof
已取消保留,现在可以用作标识符。GlobalAlloc
trait 和 #[global_allocator]
属性现在是稳定的。 这将允许用户为其程序指定全局分配器。#[test]
属性的单元测试函数除了 ()
之外,现在还可以返回 Result<(), E: Debug>
。macro_rules!
的 lifetime
说明符现在是稳定的。 这允许宏轻松定位生命周期。s
和 z
优化级别现在是稳定的。 这些优化优先考虑减小二进制文件大小。z
与 s
相同,唯一的区别是它不向量化循环,这通常会导致更小的二进制文件。--error-format=short
指定此选项将提供更压缩的 Rust 错误消息输出。macro_export
时,添加了 lint 警告。&mut str
实现了 Default
。From<bool>
。()
实现了 Extend
。time::Duration
的 Debug
实现现在应该更易于人类阅读。 以前,一秒的 Duration
将打印为 Duration { secs: 1, nanos: 0 }
,现在将打印为 1s
。Cow<str>
实现了 From<&String>
,为 Cow<[T]>
实现了 From<&Vec<T>>
,为 CString
实现了 From<Cow<CStr>>
,为 Cow<CStr>
实现了 From<CString>, From<CStr>, From<&CString>
,为 Cow<OsStr>
实现了 From<OsString>, From<OsStr>, From<&OsString>
,为 Cow<Path>
实现了 From<&PathBuf>
,为 PathBuf
实现了 From<Cow<Path>>
。Wrapping<u128>
和 Wrapping<i128>
实现了 Shl
和 Shr
。DirEntry::metadata
现在在可能的情况下使用 fstatat
而不是 lstat
。 这可以提供高达 40% 的速度提升。format!
时的错误消息。Iterator::step_by
Path::ancestors
SystemTime::UNIX_EPOCH
alloc::GlobalAlloc
alloc::Layout
alloc::LayoutErr
alloc::System
alloc::alloc
alloc::alloc_zeroed
alloc::dealloc
alloc::realloc
alloc::handle_alloc_error
btree_map::Entry::or_default
fmt::Alignment
hash_map::Entry::or_default
iter::repeat_with
num::NonZeroUsize
num::NonZeroU128
num::NonZeroU16
num::NonZeroU32
num::NonZeroU64
num::NonZeroU8
ops::RangeBounds
slice::SliceIndex
slice::from_mut
slice::from_ref
{Any + Send + Sync}::downcast_mut
{Any + Send + Sync}::downcast_ref
{Any + Send + Sync}::is
src
目录的构建脚本的 crate。 crate 中的 src
目录应被视为不可变的。rustc
的 json 输出中的 suggestion_applicability
字段现在是稳定的。 这将允许开发工具检查代码建议是否适用于它们。rustdoc 在运行时会在 /tmp/rustdoc/plugins 目录中执行插件,这使得可以在给定机器上以其他用户的身份执行代码。此版本修复了该漏洞;您可以在 博客 上阅读有关此漏洞的更多信息。相关的 CVE 是 CVE-2018-1000622。
感谢 Red Hat 负责任地向我们披露此漏洞。
proc
用作标识符。Trait
语法,并且在与 impl Trait
结合使用时应该更清晰,因为它等效于以下语法:&Trait == &dyn Trait
、&mut Trait == &mut dyn Trait
和 Box<Trait> == Box<dyn Trait>
。fn foo<#[lifetime_attr] 'a, #[type_attr] T: 'a>() {}
#[must_use]
属性现在也可以在函数以及类型上使用。 它提供了一个 lint,默认情况下,当函数返回的值未使用时,会警告用户。arch::x86
和 arch::x86_64
模块,其中包含 SIMD 内联函数、一个名为 is_x86_feature_detected!
的新宏、#[target_feature(enable="")]
属性以及将 target_feature = ""
添加到 cfg
属性。[u8]
、f32
和 f64
的方法现在在 core 中可用。ops::{Shl, ShlAssign, Shr}
上的泛型 Rhs
类型参数现在默认为 Self
。std::str::replace
现在具有 #[must_use]
属性,以明确该操作不是就地完成的。Clone::clone
、Iterator::collect
和 ToOwned::to_owned
现在具有 #[must_use]
属性,以警告未使用的可能昂贵的分配。DoubleEndedIterator::rfind
DoubleEndedIterator::rfold
DoubleEndedIterator::try_rfold
Duration::from_micros
Duration::from_nanos
Duration::subsec_micros
Duration::subsec_millis
HashMap::remove_entry
Iterator::try_fold
Iterator::try_for_each
NonNull::cast
Option::filter
String::replace_range
Take::set_limit
hint::unreachable_unchecked
os::unix::process::parent_id
ptr::swap_nonoverlapping
slice::rsplit_mut
slice::rsplit
slice::swap_with_slice
cargo-metadata
现在包括 authors
、categories
、keywords
、readme
和 repository
字段。cargo-metadata
现在包括包的 metadata
表。--target-dir
可选参数。 这允许您指定与 target
不同的目录来放置编译工件。[[bin]]
),并且在 Cargo 将推断二进制文件的位置有其他二进制文件,则 Cargo 将产生警告。您可以通过将以下任何一项设置为 false 来提前禁用此功能:autobins
、autobenches
、autoexamples
、autotests
。CARGO_CACHE_RUSTC_INFO=0
来禁用此功能。doc.rust-lang.org
上提供的所有书籍现在都可以搜索。CharExt
或 StrExt
方法将不再有效。 例如:::core::prelude::v1::StrExt::is_empty("")
将无法编译,"".is_empty()
仍然可以编译。atomic::{AtomicBool, AtomicIsize, AtomicPtr, AtomicUsize}
上的 Debug
输出将仅打印内部类型。 例如:print!("{:?}", AtomicBool::new(true))
将打印 true
,而不是 AtomicBool(true)
。repr(align(N))
的最大数字现在是 2²⁹。 以前您可以输入更高的数字,但 LLVM 不支持它们。高达 512MB 的对齐应涵盖所有用例。std::error::Error
trait 上的 .description()
方法 已被软弃用。不再需要实现它。fn main() -> impl Trait
不再适用于非 Termination trait。 这恢复了意外的稳定化。NaN > NaN
在 const-fn 上下文中不再返回 true。impl Trait
使用 turbofish。Copy
和/或 Clone
。for x in 0..=10
现在是稳定的。'_
生命周期现在是稳定的。下划线生命周期可以用于任何可以省略生命周期的地方。impl Trait
现在是稳定的,允许您在返回类型或函数参数中使用抽象类型。 例如:fn foo() -> impl Iterator<Item=u8>
或 fn open(path: impl AsRef<Path>)
。u128
和 i128
现在是稳定的。main
除了 ()
之外,现在还可以返回 Result<(), E: Debug>
。wasm32-unknown-unknown
的默认链接器。--remap-path-prefix
选项。 允许您重新映射编译器输出的路径前缀。powerpc-unknown-netbsd
目标。usize
实现了 From<u16>
,为 isize
实现了 From<{u8, i16}>
。assert!(format!("{:02x?}", b"Foo\0") == "[46, 6f, 6f, 00]")
cmp::Reverse
实现了 Default, Hash
。str::repeat
,在大规模情况下速度提高了 8 倍。ascii::escape_default
现在在 libcore 中可用。cmp::Reverse
实现了 Copy, Clone
char::{ToLowercase, ToUppercase}
实现了 Clone
。*const T::add
*const T::copy_to_nonoverlapping
*const T::copy_to
*const T::read_unaligned
*const T::read_volatile
*const T::read
*const T::sub
*const T::wrapping_add
*const T::wrapping_sub
*mut T::add
*mut T::copy_to_nonoverlapping
*mut T::copy_to
*mut T::read_unaligned
*mut T::read_volatile
*mut T::read
*mut T::replace
*mut T::sub
*mut T::swap
*mut T::wrapping_add
*mut T::wrapping_sub
*mut T::write_bytes
*mut T::write_unaligned
*mut T::write_volatile
*mut T::write
Box::leak
FromUtf8Error::as_bytes
LocalKey::try_with
Option::cloned
btree_map::Entry::and_modify
fs::read_to_string
fs::read
fs::write
hash_map::Entry::and_modify
iter::FusedIterator
ops::RangeInclusive
ops::RangeToInclusive
process::id
slice::rotate_left
slice::rotate_right
String::retain
Fn
trait 别名化为 dyn
不再有效。 例如,以下语法现在无效。
'static
。 例如:
AsciiExt
trait,推荐使用固有方法。".e0"
现在不再解析为 0.0
,而是会导致错误。#[repr(align(x))]
属性现在已稳定。 RFC 1358use std::{fs::File, io::Read, path::{Path, PathBuf}};
|
。 例如:enum Foo { A, B, C }
fn main() {
let x = Foo::A;
match x {
| Foo::A
| Foo::B => println!("AB"),
| Foo::C => println!("C"),
}
}
process::Command
实现了 Send。ParseCharError
实现了 PartialEq 和 Eq。UnsafeCell::into_inner
现在是安全的。Float::{from_bits, to_bits}
现在在 libcore 中可用。AsRef<Path>
Cursor<&mut Vec<u8>>
实现了 Write
Duration
移动到了 libcore。以下函数现在可以在常量表达式中使用。例如:static MINUTE: Duration = Duration::from_secs(60);
net::lookup_host
。rustdoc
已切换到 pulldown 作为默认的 markdown 渲染器。#[simd]
。sysv64
ffi 现在可用。 例如:extern "sysv64" fn foo () {}
codegen-units=1
。armv4t-unknown-linux-gnueabi
目标。aarch64-unknown-openbsd
支持str::find::<char>
现在使用 memchr。 这应该会在大多数情况下带来 10 倍的性能提升。OsStr
的 Debug
实现现在是无损的,并且与 Windows 保持一致。time::{SystemTime, Instant}
现在实现了 Hash
。AtomicBool
实现了 From<bool>
{Arc<CStr>, Rc<CStr>}
实现了 From<{CString, &CStr}>
{Arc<OsStr>, Rc<OsStr>}
实现了 From<{OsString, &OsStr}>
{Arc<Path>, Rc<Path>}
实现了 From<{PathBuf, &Path}>
AsciiExt
方法复制到 char
ptr::is_null()
上的 T: Sized
要求{TryRecvError, RecvTimeoutError}
实现了 From<RecvError>
f32::{min, max}
,以生成更高效的 x86 汇编代码[u8]::contains
现在使用 memchr,这提供了 3 倍的速度提升以下函数现在可以在常量表达式中使用。例如:let buffer: [u8; size_of::<usize>()];
, static COUNTER: AtomicUsize = AtomicUsize::new(1);
AtomicBool::new
AtomicUsize::new
AtomicIsize::new
AtomicPtr::new
Cell::new
{integer}::min_value
{integer}::max_value
mem::size_of
mem::align_of
ptr::null
ptr::null_mut
RefCell::new
UnsafeCell::new
workspace.default-members
配置,以覆盖虚拟工作区中隐含的 --all
。Cargo.toml
和 .cargo/config
,以分别在每个项目或全局基础上禁用它。Debug
实现现在始终打印小数点。Ipv6Addr
现在拒绝 IPv6 地址中多余的 ::
。 这符合 IETF RFC 4291 §2.2。Formatter::flags
方法现已弃用。 应该改用 sign_plus
、sign_minus
、alternate
和 sign_aware_zero_pad
。column!()
宏是基于 1 的,而不是基于 0 的fmt::Arguments
不再能在线程之间共享#[repr(packed)]
结构体字段现在是不安全的auto
trait。TrapUnreachable
,这应该减轻未定义行为的影响。assert_eq/ne
宏中使用尾随逗号AtomicPtr<T>
实现了 From<*mut T>
AtomicUsize/AtomicIsize
实现了 From<usize/isize>
。RwLock<T>: Send
的 T: Sync
要求{<*const T>, <*mut T>}::as_ref
和 <*mut T>::as_mut
的 T: Sized
要求Thread::{park, unpark}
的实现SliceExt::binary_search
的性能。()
实现了 FromIterator<()>
AsciiExt
trait 方法复制到原始类型。 AsciiExt
的使用现已弃用。cargo uninstall foo bar
卸载 foo
和 bar
。cargo check
添加了单元测试检查cargo install --version
安装特定版本char::escape_debug
现在使用 Unicode 10 而不是 9。non_snake_case
lint 现在允许外部 no-mangle 函数T op= &T
现在适用于数字类型。 例如:let mut x = 2; x += &8;
Drop
的类型现在允许在 const
和 static
类型中使用le32-unknown-nacl
的支持armv5te_unknown_linux_gnueabi
上进行高达 32 位的原子操作Box<Error>
现在实现了 From<Cow<str>>
std::mem::Discriminant
现在保证是 Send + Sync
fs::copy
现在返回 NTFS 上主流的长度。Instant += Duration
中的溢出。{&mut Hasher, Box<Hasher>}
实现了 Hasher
SplitWhitespace
实现了 fmt::Debug
。Option<T>
现在实现了 Try
这允许将 ?
与 Option
类型一起使用。examples
文件夹子目录中具有 main.rs
文件的多文件示例。Cargo.lock
中的 [root]
更改为 [package]
具有旧格式的包将继续工作,并且可以使用 cargo update
更新。libbacktrace
现在在 Apple 平台上可用。compile_fail
属性。 这现在允许你指定给定的代码示例将无法编译。T: Clone
的数组和元组生成内置的 Clone
实现Stdin
、Stdout
和 Stderr
现在实现了 AsRawFd
。Rc
和 Arc
现在实现了 From<&[T]> where T: Clone
, From<str>
, From<String>
, From<Box<T>> where T: ?Sized
, 和 From<Vec<T>>
。cargo install
--all
Cargo.toml
中添加了 [patch]
部分,以处理预发布依赖项 RFC 1969Cargo.toml
中的 include
和 exclude
字段现在接受类似 gitignore 的模式--all-targets
选项rustup component add rls-preview
安装std::os
文档现在显示在 doc.rust-lang.org 上 以前只显示 std::os::unix
。CodeMap
结构,这需要不稳定的库 libsyntax
才能正确使用。unused_results
lint 不再忽略布尔值wasm32-experimental-emscripten
目标构建 WASM。msp430-none-elf
目标。{HashMap,BTreeMap}::{Keys,Values}
上的 Debug 约束。PartialEq
、Eq
、PartialOrd
、Ord
、Debug
、Hash
。Ref
、RefMut
、MutexGuard
、RwLockReadGuard
、RwLockWriteGuard
实现了 fmt::{Display, Debug}
DefaultHasher
实现了 Clone
。SyncSender
实现了 Sync
。char
实现了 FromStr
{f32, f64}::{is_sign_negative, is_sign_positive}
处理 NaN 的方式。unimplemented!()
宏中使用消息。 即:unimplemented!("等待 1.21 版本稳定")
pub(restricted)
现在在 thread_local!
宏中受支持。{f32, f64}::{min, max}
,而不是使用 CMath。ops::{Range, RangeFrom}
的 Iterator::nth
现在以 O(1) 时间完成#[repr(align(N))]
属性的最大数字现在是 2^31 - 1。 以前是 2^15。{OsStr, Path}::Display
现在尽可能避免分配CStr::into_c_string
CString::as_c_str
CString::into_boxed_c_str
Chain::get_mut
Chain::get_ref
Chain::into_inner
Option::get_or_insert_with
Option::get_or_insert
OsStr::into_os_string
OsString::into_boxed_os_str
Take::get_mut
Take::get_ref
Utf8Error::error_len
char::EscapeDebug
char::escape_debug
compile_error!
f32::from_bits
f32::to_bits
f64::from_bits
f64::to_bits
mem::ManuallyDrop
slice::sort_unstable_by_key
slice::sort_unstable_by
slice::sort_unstable
str::from_boxed_utf8_unchecked
str::as_bytes_mut
str::as_bytes_mut
str::from_utf8_mut
str::from_utf8_unchecked_mut
str::get_mut
str::get_unchecked_mut
str::get_unchecked
str::get
str::into_boxed_bytes
~/.cargo/config
移动到 ~/.cargo/credentials
。src/bin
子目录中的 main.rs
二进制文件。 即:拥有 src/bin/server/main.rs
和 src/bin/client/main.rs
会生成 target/debug/server
和 target/debug/client
--vers
在通过 cargo install
安装时指定二进制文件的版本。--no-fail-fast
标志,以运行所有基准测试,无论是否失败。'static
的函数现在不如使用生命周期参数的函数那样可用。{f32, f64}::is_sign_{negative, positive}
的重新实现现在考虑了 NaN 的符号,而以前没有。struct Point(u32, u32); let x = Point { 0: 7, 1: 0 };
。loop
现在可以使用 break
返回值。 RFC 1624 例如:let x = loop { break 7; };
union
现在可用。 RFC 1444 它们只能包含 Copy
类型,并且不能具有 Drop
实现。例如:union Foo { bar: u8, baz: usize }
fn
, RFC 1558 例如:let foo: fn(u8) -> u8 = |v: u8| { v };
arm-linux-androideabi
更改为对应于 armeabi
官方 ABI。 如果您希望继续以 armeabi-v7a
ABI 为目标,则应使用 --target armv7-linux-androideabi
。aborting due to previous error(s)
,而不是 aborting due to N previous errors
以前这是不准确的,并且只会计算某些类型的错误。target-feature=+crt-static
选项 RFC 1721 这允许静态链接带有 C 运行时库 (CRT) 的库。String
现在实现了 FromIterator<Cow<'a, str>>
和 Extend<Cow<'a, str>>
Vec
现在实现了 From<&mut [T]>
Box<[u8]>
现在实现了 From<Box<str>>
SplitWhitespace
现在实现了 Clone
[u8]::reverse
现在快了 5 倍,[u16]::reverse
现在快了 1.5 倍eprint!
和 eprintln!
宏已添加到 prelude。 与 print!
宏相同,但用于打印到 stderr。println!("cargo:rustc-env=FOO=bar");
cargo bench
子命令添加了 --all
标志,以运行给定工作区中所有成员的基准测试。libssh2-sys
到 0.2.6--exclude
选项,用于在使用 --all
选项时排除某些包--features
选项现在接受多个逗号或空格分隔的值。rust-windbg.cmd
用于在 Windows 调试器中加载 rust .natvis
文件。#
的能力 通过添加额外的 #
,即:##
现在是 #
MutexGuard<T>
只有在 T
是 Sync
的情况下才能是 Sync
。-Z
标志现在不再允许在 stable 编译器上使用。 这在一年前就已发出警告。-Z
标志的更改,cargo-check
插件不再工作。 用户应迁移到内置的 check
命令,该命令自 1.16 起可用。._
结尾的浮点文字现在是一个硬错误。示例:42._
。extern crate
现在是一个硬错误。 这以前是一个警告。use ::self::foo;
现在是一个硬错误。 self
路径始终是相对的,而 ::
前缀使路径成为绝对路径,但会被忽略,并且路径仍然是相对的。PartialEq
和 Eq
的结构体或枚举常量在匹配模式中使用现在是一个硬错误 这以前是一个警告。'_
的生命周期。 这以前是一个警告。#
组成的行现在可见VCINSTALLDIR
设置不正确,rustc
将尝试使用它来查找链接器,并且构建将失败,而以前不会失败pub
现在可以接受模块路径,以使该项仅对该模块树可见。 也接受关键字 crate
,使某些内容对整个 crate 公开,但不对库的用户公开。 示例:pub(crate) mod utils;
。 RFC 1422。#![windows_subsystem]
属性 保守地公开了 Windows 平台上的 /SUBSYSTEM
链接器标志。 RFC 1665。ty
可以接受诸如 Write + Send
之类的类型,trait 对象中现在支持尾随 +
,并为以 ?Sized
开头的 trait 对象提供了更好的错误报告。repr
属性或带有 #[repr(Rust)]
的结构体将被重新排序,以最大限度地减少填充,并在某些情况下产生更小的表示形式。--emit mir
发出 mirVec::from_iter
处理传入 vec::IntoIter
的情况 如果迭代器没有被推进,则原始 Vec
会被重新组装,而无需实际迭代或重新分配。AtomicBool::fetch_nand
Child::try_wait
HashMap::retain
HashSet::retain
PeekMut::pop
TcpStream::peek
UdpSocket::peek
UdpSocket::peek_from
cargo new --vcs pijul
使用 Pijul 创建新的 cargo 项目--bins
和 --tests
标志 现在您可以构建特定类型的所有程序,例如 cargo build --bins
将构建所有二进制文件。--enable-commonmark
标志#
开头的文件更改了 0
标志在 format! 中的工作方式 填充零现在始终放在符号之后(如果存在)和数字之前。使用 #
标志,零放在前缀之后和数字之前。
由于结构字段优化,对没有 repr
属性或 #[repr(Rust)]
的结构使用 transmute
将不再起作用。这始终是未定义的行为,但现在在实践中更有可能崩溃。
trait object 类型解析的重构 修复了一个 bug,其中 +
接收到错误的优先级,例如将 &for<'a> Tr<'a> + Send
解析为 &(for<'a> Tr<'a> + Send)
而不是 (&for<'a> Tr<'a>) + Send
rustc main.rs -o out --emit=asm,llvm-ir
现在将输出 out.asm
和 out.ll
,而不仅仅是其中一种文件类型。
rustc 现在使用 “pthreads” 风格的 MinGW for Windows GNU 构建 这导致了一些回归,即
'static
。 RFC 1623Self
可以包含在 impls
的 where
子句中。 RFC 1647T: Unsize<U>
时,T
和 U
之间没有子类型关系。例如,将 &mut [&'a X; N]
强制转换为 &mut [&'b X]
需要 'a
等于 'b
。修复了健全性问题。[]
的值会自动强制转换--emit dep-info
时快速退出-C relocation-model
更正确地确定链接器是否创建位置无关的可执行文件-C overflow-checks
以直接控制整数溢出是否 panicSelf
出现在 impl
where
子句中。use
导入的未知宏提供建议panic=abort
时,在 Emscripten 上剥离异常处理代码&str + &str
添加更清晰的错误消息Arc::into_raw
Arc::from_raw
Arc::ptr_eq
Rc::into_raw
Rc::from_raw
Rc::ptr_eq
Ordering::then
Ordering::then_with
BTreeMap::range
BTreeMap::range_mut
collections::Bound
process::abort
ptr::read_unaligned
ptr::write_unaligned
Result::expect_err
Cell::swap
Cell::replace
Cell::into_inner
Cell::take
BTreeMap
和 BTreeSet
可以迭代范围Cell
可以存储非 Copy
类型。 RFC 1651String
实现了 FromIterator<&char>
Box
实现了 许多新的转换:From<Box<str>> for String
, From<Box<[T]>> for Vec<T>
, From<Box<CStr>> for CString
, From<Box<OsStr>> for OsString
, From<Box<Path>> for PathBuf
, Into<Box<str>> for String
, Into<Box<[T]>> for Vec<T>
, Into<Box<CStr>> for CString
, Into<Box<OsStr>> for OsString
, Into<Box<Path>> for PathBuf
, Default for Box<str>
, Default for Box<CStr>
, Default for Box<OsStr>
, From<&CStr> for Box<CStr>
, From<&OsStr> for Box<OsStr>
, From<&Path> for Box<Path>
ffi::FromBytesWithNulError
实现了 Error
和 Display
PartialOrd<A> for [A] where A: Ord
slice::sort
Cow<'a, str>
和 String
添加了 ToString
trait specializationBox<[T]>
实现了 From<&[T]> where T: Copy
, Box<str>
实现了 From<&str>
IpAddr
为各种数组实现了 From
。SocketAddr
实现了 From<(I, u16)> where I: Into<IpAddr>
format!
在写入字符串之前估计所需的容量PathBuf
实现了 Default
VecDeque<A>
实现了 PartialEq<[A]>
HashMap
自适应地调整大小 以防止 DOS 攻击和不良哈希函数。cargo check --all
cargo run --package
required_features
build.rs
是一个构建脚本workspace_root
链接查找工作区rustbook
渲染i128
导致的 MSP430 崩溃rustc
在 Windows MSVC 目标上静态链接,使其无需安装 MSVC 运行时即可运行。rustdoc --test
在测试名称中包含文件名std
的构建,用于 sparc64-unknown-linux-gnu
、aarch64-unknown-linux-fuchsia
和 x86_64-unknown-linux-fuchsia
。aarch64-unknown-freebsd
i686-unknown-netbsd
TypeId
实现了 PartialOrd
和 Ord
--test-threads=0
产生错误rustup
默认安装文档T: Unsize<U>
时,不允许 T
和 U
之间存在子类型关系,例如,将 &mut [&'a X; N]
强制转换为 &mut [&'b X]
需要 'a
等于 'b
。修复了健全性问题。format!
和 Display::to_string
会 panic。以前,错误会被静默忽略。当写入字符串时,write_fmt
返回错误是不正确的。proc_macro_derives
的惰性属性hr_lifetime_in_assoc_type
未来兼容性 lint 自 2016 年 4 月以来一直有效。dead_code
lint 现在考虑了类型别名.self
的语义Self
可以出现在 impl
标头中Self
可以出现在结构体表达式中rustc
现在支持 --emit=metadata
,这将导致 rustc 发出仅包含 crate 元数据的 .rmeta
文件。Rust Language Service 等工具可以使用它来执行仅元数据的构建。transmute::<T, U>
,其中 T
比 U
需要更大的对齐方式rustc
不再尝试提供 “考虑使用显式生命周期” 建议。它们不准确。VecDeque::truncate
VecDeque::resize
String::insert_str
Duration::checked_add
Duration::checked_sub
Duration::checked_div
Duration::checked_mul
str::replacen
str::repeat
SocketAddr::is_ipv4
SocketAddr::is_ipv6
IpAddr::is_ipv4
IpAddr::is_ipv6
Vec::dedup_by
Vec::dedup_by_key
Result::unwrap_or_default
<*const T>::wrapping_offset
<*mut T>::wrapping_offset
CommandExt::creation_flags
File::set_permissions
String::split_off
[T]::binary_search
和 [T]::binary_search_by_key
现在通过 Borrow
参数获取其参数Debug
IpAddr
实现了 From<Ipv4Addr>
和 From<Ipv6Addr>
Ipv6Addr
实现了 From<[u16; 8]>
Stdin.read()
返回LineWriter
中的部分写入&str
切片错误使用更具体的 panic 消息TcpListener::set_only_v6
已弃用。此功能目前在 std 中无法实现。writeln!
,像 println!
一样,现在接受没有字符串或格式化参数的形式,只是为了打印换行符Result
实现 iter::Sum
和 iter::Product
std_unicode::tables
中静态数据的大小char::EscapeDebug
, EscapeDefault
, EscapeUnicode
, CaseMappingIter
, ToLowercase
, ToUppercase
实现了 Display
Duration
实现了 Sum
String
实现了 ToSocketAddrs
cargo check
命令对项目进行类型检查而不构建它debug
的整数值,除了 true
和 false
之外。这些作为 -C debuginfo
的值传递给 rustc
cargo --version --verbose
build --all
构建所有工作区成员doc --all
文档化所有工作区成员rustdoc
有一个 --sysroot
参数,与 rustc
一样,指定 Rust 实现的路径armv7-linux-androideabi
目标不再启用 NEON 扩展,根据 Google 的 ABI 指南dead_code
lint 现在考虑了类型别名.Stdin.read()
返回self
的语义#[derive]
,又名 “macros 1.1”,是稳定的。这允许像 Serde 和 Diesel 这样流行的代码生成 crate 符合人体工程学地工作。 RFC 1681。legacy_imports
lint 进行过渡,没有已知的回归。macro_rules
中,path
片段现在可以解析为类型参数 bound?Sized
可以用于 where
子句中#![type_size_limit]
crate 属性进行修改,类似于 #![recursion_limit]
属性--test
标志适用于过程宏 crateextern "aapcs" fn
ABI-C no-stack-check
标志已弃用。它没有任何作用。format!
扩展器识别不正确的 printf
和 shell 样式格式化指令,并建议正确的格式.Ty::super_fold_with
中不必要的 mk_ty
调用Ty::super_fold_with
中避免更多不必要的 mk_ty
调用UnificationTable::probe
中克隆scope_auxiliary
以将 RSS 减少 10%hir::Expr
中的 HirVec<P<T>>
更改为 HirVec<T>
std::iter::Iterator::min_by
std::iter::Iterator::max_by
std::os::*::fs::FileExt
std::sync::atomic::Atomic*::get_mut
std::sync::atomic::Atomic*::into_inner
std::vec::IntoIter::as_slice
std::vec::IntoIter::as_mut_slice
std::sync::mpsc::Receiver::try_iter
std::os::unix::process::CommandExt::before_exec
std::rc::Rc::strong_count
std::rc::Rc::weak_count
std::sync::Arc::strong_count
std::sync::Arc::weak_count
std::char::encode_utf8
std::char::encode_utf16
std::cell::Ref::clone
std::io::Take::into_inner
Iterator::nth
不再具有 Sized
boundExtend<&T>
专门针对 Vec
,其中 T: Copy
,以提高性能。chars().count()
快得多,chars().last()
和 char_indices().last()
也是如此std::env::args
中的 ARM Objective-C ABIfmt::Debug
中正确显示Duration
派生 Default
mpsc::RecvTimeoutError
实现了 Error
OUT_DIR
环境变量(通过 env!("OUT_DIR")
)。他们应该在运行时使用 std::env
检查变量。该值在构建时设置是一个 bug,并且在交叉编译时不正确。此更改已知会导致破坏。cargo test
添加 --all
标志cargo install --vers
接受 semver 版本build.rustflags
配置键实现字符串查找Cargo.toml
在同一目录中的 build.rs
是一个构建脚本--message-format JSON
--test
构建的二进制文件)现在支持 --list
参数,该参数列出它包含的测试--exact
参数,该参数使测试过滤器完全匹配,而不是仅匹配测试名称的子字符串--playground-url
标志#[should_panic]
错误的更多详细信息--disable-rustbuild
传递给 configure 脚本,但它们将很快被删除。请注意,新的构建系统使用不同的磁盘布局,这可能会影响任何构建 Rust 的脚本。legacy_imports
lint 进行过渡,没有已知的回归。OUT_DIR
环境变量(通过 env!("OUT_DIR")
)。他们应该在运行时使用 std::env
检查变量。该值在构建时设置是一个 bug,并且在交叉编译时不正确。此更改已知会导致破坏。hr_lifetime_in_assoc_type
lint 自 1.10 以来一直是警告,现在默认情况下是错误。它将在不久的将来成为硬错误。legacy_directory_ownership
lint 中捕获,该 lint 在此版本中是一个警告,并且将来会成为硬错误。Peekable
peeked 一个 None
,它将返回该 None
,而无需重新查询底层迭代器..
匹配枚举变体、结构体和元组中的多个元组字段。RFC 1492。fn
item 可以强制转换为 unsafe fn
指针use *
和 use ::*
都从 crate 根目录进行 glob 导入Vec<Box<Fn()>>
而无需显式解引用static mut
名称像其他静态变量和常量一样进行 lint[u8; m!()]
)x
吗” 的错误消息和代码片段--version --verbose
中包含 LLVM 版本Expr_::ExprInlineAsm
IchHasher
哈希的字节数CombineFields::instantiate
中使用 SmallVector
ArrayVec
和 AccumulateVec
以减少在切片内部化期间的堆分配write_metadata
CrateConfig
克隆Substs::super_fold_with
ObligationForest
的 NodeState
处理plug_leaks
println!()
,不带参数,打印换行符。以前,需要一个空字符串才能实现相同的效果。Wrapping
实现了标准二进制和一元运算符,以及 Sum
和 Product
迭代器String
实现 From<Cow<str>>
,为 Vec<T>
实现 From<Cow<[T]>>
chain
、cloned
、map
和 VecDeque
迭代器的 fold
性能SipHasher
在小值上的性能.zip()
specialization 扩展到 .map()
和 .cloned()
ReadDir
实现了 Debug
RefUnwindSafe
Vec::extend
到 Vec::extend_from_slice
Decoder::read_str
中分配io::Error
实现了 From<io::ErrorKind>
Debug
HashMap
随机种子HashMap
的内部内存布局更缓存友好,在某些操作中显着提高性能HashMap
在 32 位架构上使用更少的内存Cow<str>
实现 Add<{str, Cow<str>}>
CARGO_HOME
一起工作replace
部分panic
配置rustup target add
将目标添加到现有安装中。新的目标三元组是mips-unknown-linux-gnu
mipsel-unknown-linux-gnu
mips64-unknown-linux-gnuabi64
mips64el-unknown-linux-gnuabi64
powerpc-unknown-linux-gnu
powerpc64-unknown-linux-gnu
powerpc64le-unknown-linux-gnu
s390x-unknown-linux-gnu
rustup target add
将以下三元组添加到现有 rustup 安装中arm-unknown-linux-musleabi
arm-unknown-linux-musleabihf
armv7-unknown-linux-musleabihf
wasm32-unknown-emscripten
目标。已知此目标存在重大缺陷。请测试、报告并修复。rustup component add rust-docs
来安装。try!
宏,在 RFC 0243 中描述。SipHasher
已弃用。请使用 DefaultHasher
。SipHasher
已弃用。请使用 DefaultHasher
。rustc
通过其自己的 “中间” IR (MIR) 将代码翻译为 LLVM IR。此翻译过程比之前的 AST->LLVM 过程简单得多,并创造了直接在 MIR 上执行新优化的机会。之前在 Rust 博客上描述过。rustc
呈现了一种新的、更易读的错误格式,以及机器可读的 JSON 错误输出,供 IDE 使用。大多数支持 Rust 的常用编辑器都已更新以支持它。之前在 Rust 博客上描述过。rustc
通过其自己的 “中间” IR (MIR) 将代码翻译为 LLVM IR。此翻译过程比之前的 AST->LLVM 过程简单得多,并创造了直接在 MIR 上执行新优化的机会。之前在 Rust 博客上描述过。rustc
支持 ARM 上的三个新的 MUSL 目标:arm-unknown-linux-musleabi
、arm-unknown-linux-musleabihf
和 armv7-unknown-linux-musleabihf
。这些目标生成静态链接的二进制文件。但目前还没有二进制发布版本。rustc
呈现了一种新的、更易读的错误格式,以及机器可读的 JSON 错误输出,供 IDE 使用。大多数支持 Rust 的常用编辑器都已更新以支持它。之前在 Rust 博客上描述过。Cell::as_ptr
RefCell::as_ptr
IpAddr::is_unspecified
IpAddr::is_loopback
IpAddr::is_multicast
Ipv4Addr::is_unspecified
Ipv6Addr::octets
LinkedList::contains
VecDeque::contains
ExitStatusExt::from_raw
。在 Unix 和 Windows 上。Receiver::recv_timeout
RecvTimeoutError
BinaryHeap::peek_mut
PeekMut
iter::Product
iter::Sum
OccupiedEntry::remove_entry
VacantEntry::into_key
rustup component add rust-src
安装。生成的源代码可以被工具和 IDE 使用,位于 sysroot 下的 lib/rustlib/src
中。BinaryHeap::append
BTreeMap::append
BTreeMap::split_off
BTreeSet::append
BTreeSet::split_off
f32::to_degrees
(在 libcore 中 - 之前在 libstd 中稳定)f32::to_radians
(在 libcore 中 - 之前在 libstd 中稳定)f64::to_degrees
(在 libcore 中 - 之前在 libstd 中稳定)f64::to_radians
(在 libcore 中 - 之前在 libstd 中稳定)Iterator::sum
Iterator::product
Cell::get_mut
RefCell::get_mut
-vv
打印所有 crate 的警告。HashMap
hasher 是 SipHash 1-3 而不是 SipHash 2-4 此 hasher 更快,但被认为可以提供足够的保护以防止碰撞攻击。os::windows::fs::OpenOptionsExt::access_mode
os::windows::fs::OpenOptionsExt::share_mode
os::windows::fs::OpenOptionsExt::custom_flags
os::windows::fs::OpenOptionsExt::attributes
os::windows::fs::OpenOptionsExt::security_qos_flags
os::unix::fs::OpenOptionsExt::custom_flags
sync::Weak::new
sync::Weak 的默认值
panic::set_hook
panic::take_hook
panic::PanicInfo
panic::PanicInfo::payload
panic::PanicInfo::location
panic::Location
panic::Location::file
panic::Location::line
ffi::CStr::from_bytes_with_nul
ffi::CStr::from_bytes_with_nul_unchecked
ffi::FromBytesWithNulError
fs::Metadata::modified
fs::Metadata::accessed
fs::Metadata::created
sync::atomic::Atomic{Usize,Isize,Bool,Ptr}::compare_exchange
sync::atomic::Atomic{Usize,Isize,Bool,Ptr}::compare_exchange_weak
collections::{btree,hash}_map::{Occupied,Vacant,}Entry::key
os::unix::net::{UnixStream, UnixListener, UnixDatagram, SocketAddr}
SocketAddr::is_unnamed
SocketAddr::as_pathname
UnixStream::connect
UnixStream::pair
UnixStream::try_clone
UnixStream::local_addr
UnixStream::peer_addr
UnixStream::set_read_timeout
UnixStream::set_write_timeout
UnixStream::read_timeout
UnixStream::write_timeout
UnixStream::set_nonblocking
UnixStream::take_error
UnixStream::shutdown
UnixStream
实现 Read/Write/RawFdUnixListener::bind
UnixListener::accept
UnixListener::try_clone
UnixListener::local_addr
UnixListener::set_nonblocking
UnixListener::take_error
UnixListener::incoming
UnixListener
实现 RawFdUnixDatagram::bind
UnixDatagram::unbound
UnixDatagram::pair
UnixDatagram::connect
UnixDatagram::try_clone
UnixDatagram::local_addr
UnixDatagram::peer_addr
UnixDatagram::recv_from
UnixDatagram::recv
UnixDatagram::send_to
UnixDatagram::send
UnixDatagram::set_read_timeout
UnixDatagram::set_write_timeout
UnixDatagram::read_timeout
UnixDatagram::write_timeout
UnixDatagram::set_nonblocking
UnixDatagram::take_error
UnixDatagram::shutdown
UnixDatagram
实现 RawFd{BTree,Hash}Map::values_mut
<[_]>::binary_search_by_key
abs_sub
方法已弃用。此次要方法的语义很微妙,可能不是大多数人想要的。profile.*.panic
选项。这控制 panic!
宏的运行时行为,可以是 “unwind”(默认)或 “abort”。 RFC 1513。cargo install
artifacts。使并行安装多个 crate 成为可能。fn
item 类型是零大小的,并且每个 fn
都命名一个唯一的类型。这将破坏转换 fn
的代码,因此在 `fn` 类型上调用 `transmute` 将在几个周期内生成警告,然后将转换为错误。std::panic
std::panic::catch_unwind
(从 recover
重命名)std::panic::resume_unwind
(从 propagate
重命名)std::panic::AssertUnwindSafe
(从 AssertRecoverSafe
重命名)std::panic::UnwindSafe
(从 RecoverSafe
重命名)str::is_char_boundary
<*const T>::as_ref
<*mut T>::as_ref
<*mut T>::as_mut
AsciiExt::make_ascii_uppercase
AsciiExt::make_ascii_lowercase
char::decode_utf16
char::DecodeUtf16
char::DecodeUtf16Error
char::DecodeUtf16Error::unpaired_surrogate
BTreeSet::take
BTreeSet::replace
BTreeSet::get
HashSet::take
HashSet::replace
HashSet::get
OsString::with_capacity
OsString::clear
OsString::capacity
OsString::reserve
OsString::reserve_exact
OsStr::is_empty
OsStr::len
std::os::unix::thread
RawPthread
JoinHandleExt
JoinHandleExt::as_pthread_t
JoinHandleExt::into_pthread_t
HashSet::hasher
HashMap::hasher
CommandExt::exec
File::try_clone
SocketAddr::set_ip
SocketAddr::set_port
SocketAddrV4::set_ip
SocketAddrV4::set_port
SocketAddrV6::set_ip
SocketAddrV6::set_port
SocketAddrV6::set_flowinfo
SocketAddrV6::set_scope_id
slice::copy_from_slice
ptr::read_volatile
ptr::write_volatile
OpenOptions::create_new
TcpStream::set_nodelay
TcpStream::nodelay
TcpStream::set_ttl
TcpStream::ttl
TcpStream::set_only_v6
TcpStream::only_v6
TcpStream::take_error
TcpStream::set_nonblocking
TcpListener::set_ttl
TcpListener::ttl
TcpListener::set_only_v6
TcpListener::only_v6
TcpListener::take_error
TcpListener::set_nonblocking
UdpSocket::set_broadcast
UdpSocket::broadcast
UdpSocket::set_multicast_loop_v4
UdpSocket::multicast_loop_v4
UdpSocket::set_multicast_ttl_v4
UdpSocket::multicast_ttl_v4
UdpSocket::set_multicast_loop_v6
UdpSocket::multicast_loop_v6
UdpSocket::set_multicast_ttl_v6
UdpSocket::multicast_ttl_v6
UdpSocket::set_ttl
UdpSocket::ttl
UdpSocket::set_only_v6
UdpSocket::only_v6
UdpSocket::join_multicast_v4
UdpSocket::join_multicast_v6
UdpSocket::leave_multicast_v4
UdpSocket::leave_multicast_v6
UdpSocket::take_error
UdpSocket::connect
UdpSocket::send
UdpSocket::recv
UdpSocket::set_nonblocking
BufReader
和 BufWriter
使用的默认缓冲区大小已从 64K 减小到 8K。这与其他语言使用的缓冲区大小一致。Ipv4Addr
实现了 From<[u8; 4]>
.RUSTFLAGS
变量的内容传递给命令行上的 rustc
。rustc
参数也可以在 build.rustflags
配置键中指定。ToString
针对 str
进行了特化,使其具有与 to_owned
相同的性能.Command::output
生成进程不再创建额外的线程.#[derive(PartialEq)]
和 #[derive(PartialOrd)]
为 C 风格的枚举生成更少的代码.--quiet
标志将产生更简洁的输出.mips-unknown-linux-musl
、mipsel-unknown-linux-musl
和 i586-pc-windows-msvc
目标发布 std 二进制文件。impl
代码块中定义同名方法是非法的.fn
item 类型是零大小的,并且每个 fn
都命名一个唯一的类型。这将破坏转换 fn
的代码,因此在 `fn` 类型上调用 `transmute` 将在几个周期内生成警告,然后将转换为错误。AddAssign
, SubAssign
, MulAssign
, DivAssign
, RemAssign
, BitAndAssign
, BitOrAssign
, BitXorAssign
, ShlAssign
, 或 ShrAssign
trait,支持复合赋值语句(如 +=
)的重载。RFC 953。struct Foo { }
,除了非花括号形式 struct Foo;
。RFC 218。str::encode_utf16
(从 utf16_units
重命名)str::EncodeUtf16
(从 Utf16Units
重命名)Ref::map
RefMut::map
ptr::drop_in_place
time::Instant
time::SystemTime
Instant::now
Instant::duration_since
(从 duration_from_earlier
重命名)Instant::elapsed
SystemTime::now
SystemTime::duration_since
(从 duration_from_earlier
重命名)SystemTime::elapsed
Time
和 SystemTime
的各种 Add
/Sub
implSystemTimeError
SystemTimeError::duration
SystemTimeError
的各种 implUNIX_EPOCH
AddAssign
, SubAssign
, MulAssign
, DivAssign
, RemAssign
, BitAndAssign
, BitOrAssign
, BitXorAssign
, ShlAssign
, ShrAssign
。write!
和 writeln!
宏的任何参数无法格式化,它们会正确地发出错误.raw
模块(包含许多重新定义的 C 类型)已被弃用,包括 os::raw::unix
、os::raw::macos
和 os::raw::linux
。这些模块定义了诸如 ino_t
和 dev_t
之类的类型。这些定义在不同平台上的不一致性使得正确实现 std
变得困难。那些需要这些定义的人应该使用 libc
crate。RFC 1415。MetadataExt
trait,包括 os::unix::fs::MetadataExt
,它暴露了诸如 inode 编号之类的值,不再返回平台特定的类型,而是返回加宽的整数。RFC 1415。btree_set::{IntoIter, Iter, Range}
是协变的.sync::mpsc
中的所有类型都实现了 fmt::Debug
.--print targets
标志打印支持的目标列表.--print cfg
标志打印为当前目标定义的 cfg
.rustc
可以使用新的基于 Cargo 的构建系统(用 Rust 编写)构建。它最终将取代 Rust 基于 Makefile 的构建系统。要启用它,请使用 configure --rustbuild
进行配置。match
模式的错误现在列出最多 3 个缺失的变体,同时在缺失变体超过 3 个时也指示缺失变体的总数.armv7-unknown-linux-gnueabihf
, powerpc-unknown-linux-gnu
, powerpc64-unknown-linux-gnu
, powerpc64le-unknown-linux-gnu
x86_64-rumprun-netbsd
。这些可以使用诸如 multirust 之类的工具安装。cargo init
在当前目录中创建一个新的 Cargo 项目。它在其他方面与 cargo new
类似。-v
和 --color
的配置键。verbose
和 color
分别位于 .cargo/config
的 [term]
部分中。build.jobs
键可以通过 CARGO_BUILD_JOBS
设置。环境变量优先于配置文件。cfg
语法来描述目标,以便可以一起指定多个目标的依赖项。RFC 1361。CARGO_TARGET_ROOT
、RUSTC
和 RUSTDOC
优先于 build.target-dir
、build.rustc
和 build.rustdoc
配置值.build.target
配置值设置目标平台,如 --target
.-Z
标志被认为是不稳定的,其他被认为是不稳定的标志还需要传递 -Z unstable-options
才能访问。然而,与不稳定的语言和库功能不同,这些选项在稳定发布渠道上是可访问的。展望未来,新的不稳定标志将无法在稳定发布渠道上使用,而旧的不稳定标志将警告其使用。将来,所有不稳定标志都将在稳定发布渠道上不可用。Variant(..)
语法来 match
空枚举变体。自 1.6 以来,这已发出警告。MetadataExt
trait,包括 os::unix::fs::MetadataExt
,它暴露了诸如 inode 编号之类的值,不再返回平台特定的类型,而是返回加宽的整数。RFC 1415。--cfg
编译器标志被严格解析为标识符.Command::spawn
及其等效项的任何命令行参数包含内部 NUL
字符,则返回错误.rustc
为 staticlib
库类型发出 .lib
文件,而不是 .a
文件。此外,对于 MSVC 工具链,rustc
发出名为 foo.dll.lib
而不是 foo.lib
的导入库。Path
Path::strip_prefix
(从 relative_from 重命名)path::StripPrefixError
(从 strip_prefix 返回的新错误类型)Ipv4Addr
Ipv6Addr
Vec
String
<[T]>::
clone_from_slice
,现在要求两个切片长度相同<[T]>::
sort_by_key
i32::checked_rem
, i32::checked_neg
, i32::checked_shl
, i32::checked_shr
i32::saturating_mul
i32::overflowing_add
, i32::overflowing_sub
, i32::overflowing_mul
, i32::overflowing_div
i32::overflowing_rem
, i32::overflowing_neg
, i32::overflowing_shl
, i32::overflowing_shr
u32::checked_rem
, u32::checked_neg
, u32::checked_shl
, u32::checked_shl
u32::saturating_mul
u32::overflowing_add
, u32::overflowing_sub
, u32::overflowing_mul
, u32::overflowing_div
u32::overflowing_rem
, u32::overflowing_neg
, u32::overflowing_shl
, u32::overflowing_shr
ffi::IntoStringError
CString::into_string
CString::into_bytes
CString::into_bytes_with_nul
From<CString> for Vec<u8>
IntoStringError
IntoStringError::into_cstring
IntoStringError::utf8_error
IntoStringError 的 Error
String
和 str
的速度更快了。memchr
搜索换行符,提高了 LineWriter
(以及 io::stdout
)的性能.f32::to_degrees
和 f32::to_radians
是稳定的。f64
变体之前已稳定。BTreeMap
被重写以使用更少的内存并提高插入和迭代的性能,后者提高了高达 5 倍.BTreeSet
及其迭代器 Iter
、IntoIter
和 Range
在其包含的类型上是协变的.LinkedList
及其迭代器 Iter
和 IntoIter
在其包含的类型上是协变的.str::replace
现在接受 Pattern
,像其他字符串搜索方法一样。Any
为 unsized 类型实现.Hash
为 Duration
实现.--test
运行测试时,rustdoc 将 --cfg
参数传递给编译器.rustc
安装在不寻常的配置中时,无需显式配置动态链接器搜索路径即可运行它。rustc
将 --enable-new-dtags
传递给 GNU ld。这使得任何 RPATH 条目(使用 -C rpath
发出)不 优先于 LD_LIBRARY_PATH
。cargo rustc
接受 --profile
标志,该标志在任何编译配置文件 ‘dev’、‘bench’ 或 ‘test’ 下运行 rustc
.rerun-if-changed
构建脚本指令不再导致构建脚本在某些情况下错误地运行两次.private_in_public
lint 下。".".parse::<f32>()
返回 Err
,而不是 Ok(0.0)
。#![no_std]
属性使 crate 不链接到标准库,而只链接到 core 库,如 RFC 1184 中所述。core 库定义了通用类型和 trait,但没有任何平台依赖性,并且是在无法支持标准库完整移植的环境(如操作系统)中 Rust 软件的基础。core 库的大部分现在是稳定的。Read::read_exact
, ErrorKind::UnexpectedEof
(从 UnexpectedEOF
重命名), fs::DirBuilder
, fs::DirBuilder::new
, fs::DirBuilder::recursive
, fs::DirBuilder::create
, os::unix::fs::DirBuilderExt
, os::unix::fs::DirBuilderExt::mode
, vec::Drain
, vec::Vec::drain
, string::Drain
, string::String::drain
, vec_deque::Drain
, vec_deque::VecDeque::drain
, collections::hash_map::Drain
, collections::hash_map::HashMap::drain
, collections::hash_set::Drain
, collections::hash_set::HashSet::drain
, collections::binary_heap::Drain
, collections::binary_heap::BinaryHeap::drain
, Vec::extend_from_slice
(从 push_all
重命名), Mutex::get_mut
, Mutex::into_inner
, RwLock::get_mut
, RwLock::into_inner
, Iterator::min_by_key
(从 min_by
重命名), Iterator::max_by_key
(从 max_by
重命名).assert_eq!
宏支持不实现 Sized
的参数,例如数组。这样,它的行为更像 assert!
。Duration
为单位的函数。这些包括 Condvar::wait_timeout_ms
、thread::sleep_ms
和 thread::park_timeout_ms
。Vec
保留额外元素的算法被调整为不分配过多的空间,同时仍然呈指数增长。From
转换在整数到浮点数的转换是无损的情况下实现。因此,它们未为 32 位整数到 f32
,以及 64 位整数到 f32
或 f64
实现。它们也未为 isize
和 usize
实现,因为实现将是平台特定的。From
也从 f32
到 f64
实现。From<&Path>
和 From<PathBuf>
为 Cow<Path>
实现。From<T>
为 Box<T>
、Rc<T>
和 Arc<T>
实现。IntoIterator
为 &PathBuf
和 &Path
实现。BinaryHeap
进行了重构,以实现适度的性能改进。$CARGO_HOME/bin
中查找子命令。rerun-if-changed
键来指定其依赖项。cargo clean
接受 --release
标志以清理 release 文件夹。Cargo 未能清理的各种工件现在已正确删除。unreachable_code
lint 会发出警告。RUST_PATH
环境变量。这是一个用于与包管理器集成的 pre-cargo 功能,但意外地从未删除。Foo(..)
) 不再可以用于匹配单元结构体。现在这是一个警告,但在未来的版本中将成为错误。与常量同名的模式现在是一个错误。BinaryHeap::from
, BinaryHeap::into_sorted_vec
, BinaryHeap::into_vec
, Condvar::wait_timeout
, FileTypeExt::is_block_device
, FileTypeExt::is_char_device
, FileTypeExt::is_fifo
, FileTypeExt::is_socket
, FileTypeExt
, Formatter::alternate
, Formatter::fill
, Formatter::precision
, Formatter::sign_aware_zero_pad
, Formatter::sign_minus
, Formatter::sign_plus
, Formatter::width
, Iterator::cmp
, Iterator::eq
, Iterator::ge
, Iterator::gt
, Iterator::le
, Iterator::lt
, Iterator::ne
, Iterator::partial_cmp
, Path::canonicalize
, Path::exists
, Path::is_dir
, Path::is_file
, Path::metadata
, Path::read_dir
, Path::read_link
, Path::symlink_metadata
, Utf8Error::valid_up_to
, Vec::resize
, VecDeque::as_mut_slices
, VecDeque::as_slices
, VecDeque::insert
, VecDeque::shrink_to_fit
, VecDeque::swap_remove_back
, VecDeque::swap_remove_front
, slice::split_first_mut
, slice::split_first
, slice::split_last_mut
, slice::split_last
, char::from_u32_unchecked
, fs::canonicalize
, str::MatchIndices
, str::RMatchIndices
, str::match_indices
, str::rmatch_indices
, str::slice_mut_unchecked
, string::ParseError
。cargo install
命令本地安装到 ~/.cargo/bin
。 除此之外,这使得使用新的子命令来扩充 Cargo 更加容易:当在 $PATH
中找到名为例如 cargo-foo
的二进制文件时,可以将其作为 cargo foo
调用。*
) 依赖项的 Crate 在发布时会发出警告。在 1.6 中,将不再可能发布具有通配符依赖项的 crate。AsRef
和 AsMut
的实现已添加到 Box
、Rc
和 Arc
。由于这些智能指针类型实现了 Deref
,因此在内部类型包含同名方法的情况下,这会导致破坏。Self
的 Trait 不是对象安全的。健全性修复。no_default_libraries
设置,该设置控制是否将 -nodefaultlibs
传递给链接器,并且 is_like_windows
设置不再影响 -nodefaultlibs
标志。#[derive(Show)]
已被删除。#[inline]
和 #[repr]
属性 只能出现在有效的位置。#[no_debug]
和 #[omit_gdb_pretty_printer_section]
已通过 feature gate 控制。use
语句导入不稳定 feature 的 bug.improper_ctypes
lint 不再警告在 FFI 中使用 isize
和 usize
。Arc<T>
和 Rc<T>
现在对于 T
是协变的,而不是不变的。Default
已为可变切片实现。FromStr
已为 SockAddrV4
和 SockAddrV6
实现。From
转换,这些转换是无损的。From
转换,这些转换是无损的。fs::Metadata
实现了 Clone
.parse
方法 在解析整数时接受前导 “+”。AsMut
已为 Vec
实现.String
和 BinaryHeap
的 clone_from
实现 已得到优化,不再依赖默认实现。extern "Rust"
、extern "C"
、unsafe extern "Rust"
和 unsafe extern "C"
函数类型现在 为最多 12 个参数实现了 Clone
、PartialEq
、Eq
、PartialOrd
、Ord
、Hash
、fmt::Pointer
和 fmt::Debug
。Drop
时,在未优化的构建中,drop Vec
的速度要快得多.VecDeque
与零尺寸类型结合使用时导致不正确行为的 bug。PartialOrd
更快了.str::lines
和 BufRead::lines
迭代器除了 \n
之外,还将 \r\n
视为换行符.'static
生命周期借用扩展到函数末尾.str::parse
在解析浮点数时不再引入可避免的舍入误差。 结合早期对浮点数格式化/输出的更改,“往返” 操作(如 f.to_string().parse()
)现在可以精确地保留 f
的值。 此外,现在接受前导加号.use
语句 现在可以重命名它们,例如 use foo::{bar as kitten, baz as puppy}
。pub extern crate
的行为不如预期,发出警告,直到找到更好的解决方案。<Box<str>>::into_string
、Arc::downgrade
、Arc::get_mut
、Arc::make_mut
、Arc::try_unwrap
、Box::from_raw
、Box::into_raw
、CStr::to_str
、CStr::to_string_lossy
、CString::from_raw
、CString::into_raw
、IntoRawFd::into_raw_fd
、IntoRawFd
、IntoRawHandle::into_raw_handle
、IntoRawHandle
、IntoRawSocket::into_raw_socket
、IntoRawSocket
、Rc::downgrade
、Rc::get_mut
、Rc::make_mut
、Rc::try_unwrap
、Result::expect
、String::into_boxed_str
、TcpStream::read_timeout
、TcpStream::set_read_timeout
、TcpStream::set_write_timeout
、TcpStream::write_timeout
、UdpSocket::read_timeout
、UdpSocket::set_read_timeout
、UdpSocket::set_write_timeout
、UdpSocket::write_timeout
、Vec::append
、Vec::split_off
、VecDeque::append
、VecDeque::retain
、VecDeque::split_off
、rc::Weak::upgrade
、rc::Weak
、slice::Iter::as_slice
、slice::IterMut::into_slice
、str::CharIndices::as_str
、str::Chars::as_str
、str::split_at_mut
、str::split_at
、sync::Weak::upgrade
、sync::Weak
、thread::park_timeout
、thread::sleep
。BTreeMap::with_b
、BTreeSet::with_b
、Option::as_mut_slice
、Option::as_slice
、Result::as_mut_slice
、Result::as_slice
、f32::from_str_radix
、f64::from_str_radix
。std::io::copy
允许 ?Sized
参数.Windows
、Chunks
和 ChunksMut
迭代器都 使用 O(1) 实现重写了 count
、nth
和 last
。Default
已为最多 [T; 32]
的数组实现.IntoRawFd
已添加到 Unix 特定的 prelude 中,IntoRawSocket
和 IntoRawHandle
已添加到 Windows 特定的 prelude 中.Extend<String>
和 FromIterator<String
都已为 String
实现.IntoIterator
已为 Option
和 Result
的引用实现.HashMap
和 HashSet
实现了 Extend<&T>
,其中 T: Copy
,作为 RFC 839 的一部分。 这将在极少数情况下导致类型推断破坏。BinaryHeap
实现了 Debug
.Borrow
和 BorrowMut
已为固定大小的数组实现.extern fn
s 实现了包括 Eq
、Ord
、Debug
、Hash
在内的常用 trait.&mut T
,其中 T: std::fmt::Write
也实现了 std::fmt::Write
。VecDeque::push_back
和其他容量改变方法中针对零尺寸类型导致 panic 的稳定回归.isize
和 usize
。cargo update
期间显示有关其正在执行操作的有用信息.&'a Box<Trait>
(或 &'a Rc<Trait>
等)这样的类型将从被解释为 &'a Box<Trait+'a>
更改为 &'a Box<Trait+'static>
。Duration
API 已稳定化。 这个基本的时间单位被其他 std API 以及树外时间 crate 所采用。#[prelude_import]
属性,一个内部实现细节,之前被意外地稳定化了。 它已被置于 prelude_import
feature gate 之后。 据信此更改不会破坏任何现有代码。size_of_val
和 align_of_val
的行为 对于动态大小类型更为合理。 依赖先前行为的代码被认为是损坏的。dropck
规则(检查析构函数是否无法访问已销毁的值)已更新 以匹配 RFC。 这修复了一些健全性漏洞,因此将导致一些先前可以编译的代码不再构建。size_of_val
和 align_of_val
的行为 对于动态大小类型更为合理。 依赖先前行为的代码尚不知存在,并被怀疑是损坏的。'static
变量 现在可以是递归的。ref
绑定在 Deref
和 DerefMut
实现之间正确选择。dropck
规则(检查析构函数是否无法访问已销毁的值)已更新 以匹配 RFC。Duration
API 已稳定化,以及 std::time
模块,目前仅包含 Duration
。Box<str>
和 Box<[T]>
都实现了 Clone
。CString
实现了 Borrow
,借用的 C 字符串 CStr
实现了 ToOwned
。 这两者允许在泛型代码中借用和克隆 C 字符串。CStr
实现了 Debug
。AtomicPtr
实现了 Debug
。Error
trait 对象 可以在许多常见配置中向下转型为它们的具体类型,使用 is
、downcast
、downcast_ref
和 downcast_mut
方法,类似于 Any
trait。contains
、find
、rfind
、split
。starts_with
和 ends_with
也更快了。PartialEq
性能 快得多。Hash
trait 提供了默认方法 hash_slice
,标量的实现会重写和优化该方法。Hasher
trait 现在有许多用于原始类型的专用 write_*
方法,以提高效率。std::io::Error
获得了一组用于访问 “内部错误”(如果有)的方法:get_ref
、get_mut
、into_inner
。 此外,std::error::Error::cause
的实现也委托给内部错误。process::Child
获得了 id
方法,该方法返回一个 u32
,表示平台特定的进程标识符。connect
方法已弃用,已被新的 join
方法取代(请注意,这两个方法都在不稳定的 SliceConcatExt
trait 上,但通过 prelude 的魔力,稳定代码仍然可以使用它们)。Div
运算符已为 Wrapping
类型实现。DerefMut
已为 String
实现.HashMap
的默认 hasher)的性能 对于长数据更好。AtomicPtr
实现了 Send
。read_to_end
为 Stdin
和 File
的实现现在 专门使用未初始化的缓冲区以提高性能。--explain
标志访问。dropck
阶段(检查析构函数是否无法访问已销毁的值)已被重写。 这修复了一些健全性漏洞,因此将导致一些先前可以编译的代码不再构建。rustc
现在 尽可能使用 LLVM 编写存档文件。 最终,这将消除编译器对 ar 实用程序的依赖。unused_mut
、unconditional_recursion
、improper_ctypes
和 negate_unsigned
lints 更加严格。-Z no-landing-pads
),panic!
将终止进程而不是泄漏。Rc
这样的智能指针类型包含没有固定大小的类型、数组和 trait 对象,最终启用了 Rc<[T]>
的使用并完成了 DST 的实现。rustc
的 -C codegen-units=N
标志激活它。char
上的 to_uppercase
和 to_lowercase
方法现在执行 Unicode 大小写映射,这是先前计划的行为更改,并被认为是 bug 修复。mem::align_of
现在指定 T 的最小对齐,这通常是程序感兴趣的对齐方式,并且与 clang 的 alignof
报告的值相同。 mem::min_align_of
已弃用。 据知,这不会破坏实际代码。#[packed]
属性。 此属性没有任何作用,并且提及它的代码可能无法按预期工作。associated_type_defaults
feature gate 之后。 在 1.1 中,关联类型默认值不起作用,但可以在语法上提及。 因此,这种破坏的影响极小。ref mut
的模式在与可解引用值匹配时,现在可以正确调用 DerefMut
。Extend
trait(从迭代器增长集合)已为 String
、Vec
、LinkedList
、VecDeque
、EnumSet
、BinaryHeap
、VecMap
、BTreeSet
和 BTreeMap
实现,用于引用的迭代器。 RFC。iter::once
函数返回一个产生单个元素的迭代器,iter::empty
返回一个不产生任何元素的迭代器。str
上的 matches
和 rmatches
方法返回子字符串匹配的迭代器。Cell
和 RefCell
都实现了 Eq
。wrapping_div
、wrapping_rem
、wrapping_neg
、wrapping_shl
、wrapping_shr
。 这些方法是对现有的 wrapping_add
、wrapping_sub
和 wrapping_mul
方法以及 Wrapping
类型的替代方案的补充。 Rust 中的默认算术运算溢出是非法的; 包装的意愿必须是明确的。{:#?}
格式说明符 显示了 Debug
格式化器的备用、漂亮打印形式。 此 feature 实际上是在 1.0 之前引入的,但鲜为人知。fmt::Formatter
实现了 fmt::Write
,这是一个 fmt
特定的 trait,用于将数据写入格式化字符串,类似于 io::Write
。fmt::Formatter
添加了 ‘debug builder’ 方法,debug_struct
、debug_tuple
、debug_list
、debug_set
、debug_map
。 代码生成器使用这些方法来发出 Debug
的实现。str
具有新的 to_uppercase
和 to_lowercase
方法,它们转换大小写,遵循 Unicode 大小写映射。PoisonError
类型公开了 into_inner
、get_ref
和 get_mut
,它们都允许访问内部锁 guard,并允许中毒锁继续运行。 RwLock
和 Mutex
的 is_poisoned
方法可以轮询中毒锁,而无需尝试获取锁。FromRawFd
trait 已为 Stdio
实现,AsRawFd
已为 ChildStdin
、ChildStdout
、ChildStderr
实现。 在 Windows 上,FromRawHandle
trait 已为 Stdio
实现,AsRawHandle
已为 ChildStdin
、ChildStdout
、ChildStderr
实现。io::ErrorKind
有一个新的变体 InvalidData
,它指示格式错误的输入。rustc
采用更智能的启发式方法来猜测 错别字。rustc
为 unsafe 指针之间不操作的转换 发出更高效的代码。std::fs
模块已扩展,以扩展公开的功能集DirEntry
现在支持诸如 file_type
和 metadata
之类的优化,这些优化在某些平台上不会导致系统调用。symlink_metadata
函数。fs::Metadata
结构现在降低到其操作系统对应物,提供对所有底层信息的访问。--explain
标志来阅读解释。错误解释也在线提供。str::split_whitespace
方法在 Unicode 空白边界处分割字符串。FromRawFd
和 AsRawFd
,在 Windows 上是 FromRawHandle
和 AsRawHandle
。这些 trait 为 File
、TcpStream
、TcpListener
和 UpdSocket
实现了。std::process
的进一步实现将在稍后稳定。std::os::unix::symlink
创建符号链接。在 Windows 上,可以使用 std::os::windows::symlink_dir
和 std::os::windows::symlink_file
创建符号链接。mpsc::Receiver
类型现在可以使用 IntoIterator
trait 上的 into_iter
转换为迭代器。Ipv4Addr
可以通过 From
trait 的 From<u32>
实现从 u32
创建。RangeFull
的 Debug
实现 创建了与其他实现更一致的输出。Debug
为 File
实现.Arc
的 Default
实现 不再需要 Sync + Send
。Iterator
方法 count
、nth
和 last
已被覆盖,以具有 O(1) 性能而不是 O(n).AtomicPtr
获得了 Default
实现.abs
现在在 启用 debug assertions 时,溢出会发生 panic。Cloned
迭代器在 1.0 版本中意外地保持不稳定状态,现已稳定。Incoming
迭代器迭代传入的 TCP 连接,在 1.0 版本中意外地无法命名,现在已正确导出。BinaryHeap
在 由 sift_up
或 sift_down
调用的函数发生 panic 时,不再会损坏自身。LinkedList
的 split_off
方法 在某些情况下不再会损坏列表。target_env
cfg 值,该值用于区分否则用于相同平台的工具链。目前,对于常见的 GNU Linux 目标和 MinGW 目标,此值设置为 gnu
,对于 MUSL Linux 目标,此值设置为 musl
。cargo rustc
命令使用自定义标志调用 rustc 进行构建。drop_with_repr_extern
lint 警告混合使用 repr(C)
和 Drop
.#[stable]
。在编译器的稳定版本中不再可能使用不稳定的功能。0b1234
现在被词法分析为 0b1234
而不是两个 token,0b1
和 234
。PhantomFn
和 MarkerTrait
语言项的需求,这些语言项已被删除。extern crate "foo" as bar
语法已被 extern crate foo as bar
替换,Cargo 现在自动将包名称中的 “-” 转换为下划线作为 crate 名称。Send
不再暗示 'static
.MyType::default()
。SliceExt
)的需求。where
子句中具有 Self: Sized
的方法被认为是对象安全的,从而允许将许多扩展 trait(如 IteratorExt
)合并到它们扩展的 trait 中。where
子句中。Send
和 Sync
这样的 trait 现在是库定义的。Any
trait 进行向下转型实际上仅限于具体类型。这有助于保留可能重要的“参数化”属性:泛型代码对于不同的类型参数,除了细微的方式外,行为不能不同。unsafe_destructor
功能现在已弃用,取而代之的是新的 dropck
。此更改大大减少了不安全代码。thread_local
模块 已重命名为 std::thread
。IteratorExt
的方法 已移动到 Iterator
trait 本身。AsMut
、AsRef
、From
和 Into
已集中在 std::convert
模块中。FromError
trait 已被删除,取而代之的是 From
。std::thread::sleep_ms
。splitn
函数现在采用一个 n
参数,该参数表示返回的迭代器产生的项目数,而不是“分割”的数量。CLOEXEC
.PartialOrd
的派生实现现在根据枚举的显式赋值判别式对枚举进行排序.Pattern
s 是通用的,目前由 &char
、&str
、FnMut(char) -> bool
和其他一些实现。String::from_str
已弃用,取而代之的是 From
impl,String::from
.io::Error
实现了 Sync
.&str
上的 words
方法已被 split_whitespace
替换,以避免回答棘手的问题,“什么是单词?”#[stable]
。这是本周期的主要库重点。.
,调整权衡以支持最常见的用法。std
中的大量剩余 API 也在本周期内稳定;大约 75% 的非弃用 API 表面现在是稳定的。Fn
trait 现在通过 继承 相关联,并提供符合人体工程学的 blanket 实现。Index
和 IndexMut
trait 已更改为按值获取索引,从而使诸如 hash_map["string"]
之类的代码可以工作。Copy
现在继承自 Clone
,这意味着所有 Copy
数据也已知为 Clone
。rustc
的 --explain
标志访问这些解释。约 1300 项更改,大量错误修复
亮点
语言
for
循环现在在 IntoIterator
trait 上运行,这消除了调用 .iter()
等来迭代集合的需要。但是,关于各种类型产生的迭代器类型,有一些新的细微之处需要记住,特别是 for foo in bar { }
从移动迭代器产生值,从而破坏原始集合。RFC。Box<Trait+'static>
。RFC。Drop
的类型中,生命周期必须超出值的生命周期。这将很快使为现在需要 #[unsafe_destructor]
的类型安全地实现 Drop
成为可能。阅读精美的 RFC 以了解详细信息。Deref<U>
的类型的引用现在自动强制转换为对解引用类型 U
的引用,例如 &T where T: Deref<U>
自动强制转换为 &U
。这应该消除许多难看的 &*
用法,例如当从对 vector 的引用转换为对切片的引用时。RFC。|&:|
, |&mut:|
, |:|
) 已过时,闭包种类是从上下文中推断出来的。Self
是一个关键字.库
Show
和 String
格式化 trait 已重命名为 Debug
和 Display
,以更清楚地反映它们的相关用途。自动获取字符串转换以与 format!("{:?}", something_to_debug)
一起使用现在写为 #[derive(Debug)]
。std::ff::{OsString, OsStr}
,以平台特定的编码提供字符串,以便更容易与系统 API 互操作。RFC。boxed::into_raw
和 Box::from_raw
函数在 Box<T>
和 *mut T
之间转换,这是创建原始指针的常见模式。工具
/usr/local/lib/rustlib/uninstall.sh
卸载。#[rustc_on_unimplemented]
属性,需要 ‘on_unimplemented’ 功能,让 rustc 在当期望为类型实现 trait 但未实现时,显示自定义错误消息。其他
约 2400 项更改,大量错误修复
亮点
isize
和 usize
的类型,而不是 int
和 uint
,用于指针大小的整数。指南将在 alpha 周期内推出。std
的 crate 已移出 Rust 发行版到 Cargo 生态系统中,以便它们可以单独发展,并且不需要尽快稳定,包括 ‘time’、‘getopts’、‘num’、‘regex’ 和 ‘term’。语言
where
子句为指定泛型 bound 提供了更通用和更具吸引力的语法,尽管以前的语法仍然有效。str
)更深入地集成到类型系统中,使其更加一致。i..j
、i..
和 ..j
,它们产生范围类型,并且当与 Index
运算符和多重分发结合使用时,会产生方便的切片表示法 [i..j]
。[T; N]
。Copy
trait 不再自动实现。不安全指针不再实现 Sync
和 Send
,因此包含它们的类型也不会自动实现。Sync
和 Send
现在是“不安全 trait”,因此如果类型即使内部结构不符合要求也符合它们的要求,则可以通过 unsafe impl
“强制”实现它们(例如,包含不安全指针的结构体,如 Arc
)。这些更改旨在防止一些 footgun,并且统称为 选择加入内置 trait(尽管 Sync
和 Send
将很快成为编译器未知的纯库类型)。String
与 &str
进行比较。if let
和 while let
不再受功能门控。macro_rules!
已被声明为稳定。尽管它是一个有缺陷的系统,但它非常受欢迎,因此必须在 1.0 中可用。已努力面向未来它,使其允许并行开发其他宏系统,并且不会以其他方式影响语言的演变。vec![1i32, 2, 3].len()
之类的表达式按预期工作。#[derive(...)]
而不是 #[deriving(...)]
来自动派生 trait,以与其他命名约定保持一致。self
而不是 mod
完成,如 use foo::{self, bar}
中所示box
运算符和 box
模式已受功能门控,等待重新设计。目前,应使用 Box::new
像其他容器一样分配唯一 box。库
fail!
宏已重命名为 panic!
,以便更容易在错误处理的上下文中讨论失败,而无需澄清您是指“fail”宏还是更广泛的失败。OsRng
在可用时优先选择新的、更可靠的 getrandom
系统调用。#[derive(Show)]
实现的 Show
格式化程序现在使用 {:?}
说明符请求,并且旨在供所有类型使用,用于诸如 println!
调试之类的用途。新的 String
格式化程序必须手动实现,使用 {}
说明符,并且旨在用于可以逻辑上表示为字符串的事物的全保真转换。工具
其他
Option<Vec<T>>
和 Option<String>
占用的空间不超过内部类型本身。约 1900 项更改,大量错误修复
亮点
std
中的许多 API 已根据正在开发的 Rust 编码指南进行审查和更新。标准库文档跟踪稳定进度。语言
Index
和 IndexMut
trait 重载索引。if let
构造仅在 let
模式匹配时才采用分支,目前在 ‘if_let’ 功能门后。[0..4]
)已在 ‘slicing_syntax’ 功能门后引入,并且可以使用 Slice
或 SliceMut
trait 重载。..
而不是前缀(例如 [a, b, c..]
),以便与其他 ..
的用法保持一致,并面向未来潜在的语法的其他用法。0..3
更改为 0...4
,以便与切片的独占范围语法保持一致。[a.., b, c]
)已放在 ‘advanced_slice_patterns’ 功能门后,将来可能会删除。value.0
语法提取元组和元组结构体的组件,目前在 tuple_indexing
功能门后。#[crate_id]
属性;版本控制由包管理器处理。extern crate foo as bar
而不是 extern crate bar = foo
。use foo as bar
而不是 use bar = foo
。let
和 match
绑定以及参数名称现在是卫生的。move
已添加为关键字,用于指示按值捕获的闭包。Share
trait 现在称为 Sync
,以释放术语 ‘shared’ 以指代 ‘shared reference’(默认引用类型)。Sized
trait,限定类型默认实现该 trait,并且类型参数默认期望该 trait。要指定类型参数不需要是 sized 的,请编写 <Sized? T>
。大多数类型都是 Sized
,值得注意的例外是 unsized 数组 ([T]
) 和 trait 类型。!
,如 || -> !
或 proc() -> !
。Gc<T>
(曾经用 @
符号表示)最终已被删除。GC 将在未来重新审视。库
std::time::Duration
类型,用于依赖于计时器的 I/O 方法,以及 ‘time’ crate 的 Timespec
算术运算。collections::btree
已重写,以具有更符合语言习惯且更有效的设计。工具
--crate-name
标志可以指定正在编译的 crate 的名称,如 #[crate_name]
。-C metadata
指定要哈希到符号名称中的附加元数据,-C extra-filename
指定要放入输出文件名中的附加信息,供包管理器用于版本控制。-C codegen-units
标志并行编译具有实验性支持。其他
约 1700 项更改,大量错误修复
语言
~[T]
已从语言中删除。此类型已被 Vec~str
已从语言中删除。此类型已被 String 类型取代。~T
已从语言中删除。此类型已被 Box@T
已从语言中删除。此类型已被标准库的 std::gc::Gcuint
而不是任何整数类型。b
来支持字节字符、字节字符串和原始字节字符串字面量。<'a>|A, B|: 'b + K -> T
priv
关键字已从语言中删除。&
-指针调用。use foo, bar, baz;
语法已从语言中删除。+
而不是 :
与对象分隔。int
,浮点文字不再默认为 f64
。如果推断无法确定文字的类型,则文字必须带有适当的类型后缀。&mut T
。库
rev()
。--cfg ndebug
传递给编译器时,该宏将被禁用。工具
[breaking-change]
注释,以便于发现重大更改。mod foo;
声明模块时,编译器现在对从何处加载模块文件更加严格。约 1500 项更改,大量错误修复
语言
~[T]
) 的模式已从语言中移除。~str
) 的模式已从语言中移除。~
分配上的标头已移除,这些标头包含类型内部的 `@` boxes 用于引用计数。priv
)。库
工具
约 1800 项更改,大量错误修复
语言
#[feature(managed_boxes)]
) 之后,为将来移除做准备。请改用标准库的 `Gc` 或 `Rc` 类型。#[feature(asm)]
)。#[feature(non_ascii_idents)]
)。#[link(name = "foo", kind = "static")]
)。#[link(name = "foo", kind = "framework")]
)。库
工具
约 2200 项更改,大量错误修复
语言
库
is_utf8
性能得到提升,影响了许多字符串函数。os::MemoryMap
提供了跨平台 mmap。ptr::offset
现在是不安全的,但同时也更加优化。不“越界”的偏移量被认为是未定义的。vec
中许多自由函数被移除,转而使用方法。FromIterator
,因此可以通过 collect
方法创建。unstable::atomics
中更完整的原子类型。comm::PortSet
已移除。Set
和 Map
traits 中的可变方法已移至 MutableSet
和 MutableMap
traits 中。Container::is_empty
、Map::contains_key
、MutableMap::insert
和 MutableMap::remove
具有默认实现。from_str
函数被移除,转而使用通用的 from_str
,该函数在 prelude 中可用。util::unreachable
已移除,转而使用 unreachable!
宏。dlist
已现代化。ToHex
和 FromHex
traits 的 hex
模块。glob
模块,取代了 std::os::glob
。rope
已移除。deque
已重命名为 ringbuf
。RingBuf
实现了 Deque
。net
和 timer
已移除。实验性替代品是 std::rt::io::net
和 std::rt::io::timer
。SmallIntMap
实现了迭代器。Bitv
和 BitvSet
实现了迭代器。SmallIntSet
已移除。请使用 BitvSet
。semver
已更新至 SemVer 2.0.0。term
可以正确处理更多终端。dbg
模块已移除。par
模块已移除。future
已清理,并进行了一些方法重命名。getopts
中的大多数自由函数已转换为方法。其他
-Z debug-info
) 大幅改进。--target-cpu
以编译为特定的 CPU 架构,类似于 gcc 的 --march
标志。--test
编译的程序现在支持 -h
和 --help
标志。rustdoc
命令调用。约 2000 个更改,大量错误修复
语言
impl
s 不再接受可见性限定符。请将它们放在方法上。self
参数不再隐式意味着 &'self self
,并且可以显式标记生命周期。+=
等) 由于错误已暂时移除。for
循环协议现在要求 for
-iterators 返回 bool
,以便它们更好地组合。Durable
trait 已被 'static
bounds 取代。#[packed]
属性的 Structs 具有字节对齐,并且字段之间没有填充。Copy
约束的类型参数现在必须使用 copy
关键字显式复制。Option<~T>
现在表示为可空指针。@mut
可以正确地进行动态借用检查。main
函数仅在 crate 的顶层检测到。#[main]
属性在任何地方仍然有效。#[no_send]
属性使本来应该是 Send
的类型变为不是。#[no_freeze]
属性使本来应该是 Freeze
的类型变为不是。RUST_MAX_STACK
环境变量指定的限制后中止进程(默认值:1GB)。vecs_implicitly_copyable
lint 模式已移除。Vectors 永远不会被隐式复制。#[static_assert]
对静态布尔值进行编译时断言。use mod
语句不再存在。语法扩展
fail!
和 assert!
接受 ~str
、&'static str
或 fmt!
-style 参数列表。Encodable
、Decodable
、Ord
、TotalOrd
、TotalEq
、DeepClone
、Rand
、Zero
和 ToStr
都可以使用 #[deriving(...)]
自动派生。bytes!
宏为字符串、u8、char 和无后缀整数 literals 返回一个字节向量。库
core
crate 已重命名为 std
。std
crate 已重命名为 extra
。iterator
模块。Iterator
的实现取代。any
、all
,已被移除。Drop
的 finalize
方法已重命名为 drop
。drop
方法现在接受 &mut self
而不是 &self
。print
、println
、FromStr
、ApproxEq
、Equiv
、Iterator
、IteratorUtil
、许多数值 traits、许多 tuple traits。Fractional
、Real
、RealExt
、Integer
、Ratio
、Algebraic
、Trigonometric
、Exponential
、Primitive
。(0, 1, 2).n2()
或 (0, 1, 2).n2_ref()
。Clone
。path
类型已重命名为 Path
。mut
模块和 Mut
类型已移除。vec
、str
中许多独立函数被移除,转而使用方法和迭代器。未来方法也将作为函数工作。reinterpret_cast
已移除。请使用 transmute
。std::ascii
中的 ascii 字符串处理。Rand
已为 ~/@ 实现。run
模块已彻底改造。unstable::atomic
。Zero
。LinearMap
和 LinearSet
已重命名为 HashMap
和 HashSet
。ptr
移至 borrow
。os::mkdir_recursive
。os::glob
函数。FuzzyEq
已重命名为 ApproxEq
。Map
现在定义了 pop
和 swap
方法。Cell
构造函数已转换为静态方法。rc
模块添加了引用计数指针,Rc
和 RcMut
。flate
模块已从 std
移至 extra
。fileinput
模块。Complex
数字类型和 complex
模块。Rational
数字类型和 rational
模块。BigInt
、BigUint
实现了数值和比较 traits。term
现在使用 terminfo,更加正确。arc
函数已转换为方法。工具
unused_variables
lint 模式用于未使用的变量(默认值:warn)。unused_unsafe
lint 模式用于检测不必要的 unsafe
块(默认值:warn)。unused_mut
lint 模式用于识别未使用的 mut
限定符(默认值:warn)。dead_assignment
lint 模式用于未读取的变量(默认值:warn)。unnecessary_allocation
lint 模式检测到一些立即被借用的堆分配,因此可以无需分配直接写入(默认值:warn)。missing_doc
lint 模式(默认值:allow)。unreachable_code
lint 模式(默认值:warn)。rusti
命令已重写,并解决了许多错误。--link-args
标志以将参数传递给链接器。-Z print-link-args
标志以进行链接调试。-g
编译将使二进制文件记录有关动态借用检查失败的信息,以进行调试。约 2100 个更改,大量错误修复
语法更改
Self
self
参数现在必须显式命名(例如:fn f(&self) { }
)。隐式 self 已弃用。static
关键字,而是通过缺少 self
参数来区分'static
生命周期取代了 Durable
traitsuper
是一个关键字,可以作为路径的前缀+
而不是空格分隔impl Trait for Type
而不是 impl Type: Trait
实现&'l foo
而不是 &l/foo
export
关键字最终被移除move
关键字已被移除(请参阅“语义更改”)[mut T]
已被移除。请使用 &mut [T]
等。mut
在 ~mut T
中不再有效。请使用继承的可变性fail
不再是关键字。请使用 fail!()
assert
不再是关键字。请使用 assert!()
log
不再是关键字。请使用 debug!
等。(T,)
mut
。请使用继承的可变性,@mut T
,core::mut
或 core::cell
extern mod { ... }
不再是外部函数模块的有效语法。请使用 extern blocks:extern { ... }
const
重命名为 static
以对应于生命周期名称,并为未来的 static mut
不安全可变全局变量腾出空间。#[deriving_eq]
替换为 #[deriving(Eq)]
等。#[deriving(Clone)]
自动生成 Clone
实现@foo as @Bar
而不是 foo as Bar
。[int, .. 3]
而不是 [int * 3]
。[int, .. GL_BUFFER_SIZE - 2]
)语义更改
move
关键字use
语句不再可以“链接” - 它们无法导入先前 use
语句导入的标识符use
语句是 crate 相对的,默认情况下从 crate 的“顶部”导入。路径可以以 super::
或 self::
为前缀来更改搜索行为。库
std::bigint
添加了大整数core::oldcomm
模块core::comm
模块core::num
下重新组织vec::slice
最终返回一个 slicedebug!
和 friends 不需要格式字符串,例如 debug!(Foo)
core::container
中的 traits 重新组织core::dvec
已移除,~[T]
是一个直接替代品core::send_map
重命名为 core::hashmap
std::map
已移除;已替换为 core::hashmap
std::treemap
已作为 owned 平衡树重新实现std::deque
和 std::smallintmap
已作为 owned 容器重新实现core::trie
已添加为整数键的快速有序 mapcore::hashmap
、core::trie
和 std::treemap
Ord
分为 Ord
和 TotalOrd
。Ord
仍用于重载比较运算符,而 TotalOrd
用于某些容器类型其他
rustc --test
现在支持带有 #[bench]
属性的基准测试约 900 项更改,大量 bug 修复
语法更改
<-
移动运算符#fmt
扩展语法到 fmt!
的过渡[T]/N
quote_tokens!
,quote_expr!
等。a.b()
始终解析为方法调用,而不是字段投影Eq
和 IterBytes
实现可以使用 #[deriving_eq]
和 #[deriving_iter_bytes]
分别自动生成.rc
文件的特殊 crate 语言语义更改
&
和 ~
指针可以指向对象struct Foo(Bar, Baz)
。将取代 newtype enums。move
&T
现在可以强制转换为 *T
let
语句以及函数调用中use
语句现在采用 crate 相对路径改进了对语言特性的支持
self
、&self
@self
和 ~self
通常都能按预期工作库
core::condition
中的新条件处理系统std::sort
std::priority_queue
std::flatpipes
getopts
定义std
core::comm
重命名为 oldcomm
。仍然已弃用rustdoc
和 cargo
现在是库其他
rusti
约 2000 个更改,大量错误修复
语法
ret
变为 return
,alt
变为 match
import
现在是 use
;use
现在是 extern mod
extern mod { ... }
现在是 extern { ... }
use mod
是导入模块的推荐方式pub
和 priv
取代了已弃用的导出列表match
模式 arms 的语法现在使用 fat arrow (=>)main
不再接受 args vector;请改用 os::args
语义
库
core::ops
中的 traits 重载std::net::url
用于表示 URLscore::send_map
中的 Sendable 哈希 mapscore::task
获得了(目前不安全的)task-local 存储 API并发
core::pipes
中std::arc
,一种原子引用计数、不可变、共享内存类型std::sync
,各种基于 arcs 和 pipes 的 exotic 同步工具其他
约 1900 项更改,大量错误修复
新的编码便利
语义清理
实验性的新语言特性
类型反射
移除各种过时的特性
关键字:'be'、'prove'、'syntax'、'note'、'mutable'、'bind'、'crust'、'native' (现在是 'extern')、'cont' (现在是 'again')
构造:do-while 循环 ('do' 已重新调整用途)、fn binding、资源 (已由析构函数取代)
编译器重组
新的库代码
工具改进
1500 个更改,大量错误修复
新的文档和文档工具
新的 port:FreeBSD x86_64
编译模型增强
调度、堆栈和线程修复
实验性的新语言特性
各种语言扩展
新的库代码
大多数语言特性都有效,包括
编译器适用于以下配置
支持交叉编译/多目标配置。
包括初步的 API 文档和包管理工具。
已知问题
文档不完整。
性能低于预期目标。
标准库 API 可能会发生广泛的更改、重组。
语言级版本控制尚未运行 - 未来的代码将意外中断。
https://doc.rust-lang.net.cn/nightly/rustc/check-cfg.html ↩