发布 Rust 1.87.0 —— 以及 Rust 十周年!

原文链接

2025 年 5 月 15 日 · Rust 发布团队

在荷兰乌得勒支举办的 "10 Years of Rust" 庆典现场,Rust 团队高兴地宣布:Rust 1.87.0 正式发布!

今天的发布日恰逢 Rust 1.0 发布整整十周年!

感谢过去和现在无数为 Rust 做出贡献的伙伴们。愿 Rust 再迎来几十年的辉煌!🎉

按照自 1.0 以来从未间断的六周固定节奏,本次稳定版包含过去 beta 分支的全部改动。

如果你已经通过 rustup 安装了旧版 Rust,只需执行:

ruby 复制代码
$ rustup update stable

即可升级到 1.87.0。 如未安装,可在官网的 appropriate page on our website 获取 rustup,并阅读 detailed release notes for 1.87.0。

如果想提前帮忙测试未来版本,可以将默认工具链切到 beta(rustup default beta)或 nightly(rustup default nightly)。发现问题请随时反馈!

1.87.0 稳定版亮点

匿名管道(Anonymous pipes)

1.87 为标准库加入了匿名管道接口,并与 std::process::Command 的输入/输出方法打通。将 stdout 与 stderr 合流,如下所示就变得相当简单,而以前要么用额外线程,要么依赖平台专用函数。

rust 复制代码
use std::process::Command;
use std::io::Read;

let (mut recv, send) = std::io::pipe()?;

let mut command = Command::new("path/to/bin")
    .stdout(send.try_clone()?)  // stdout
    .stderr(send)               // stderr 共用同一管道
    .spawn()?;

let mut output = Vec::new();
recv.read_to_end(&mut output)?;

// 必须在子进程退出前读取完数据,否则若输出过大可能填满 OS 缓冲区。
assert!(command.wait()?.success());

安全调用架构内建函数(Safe architecture intrinsics) 此前因"需要目标 CPU 特性"而被标记为 unsafe 的大部分 std::arch 内建函数,如今在启用了相应特性的代码中可 直接以安全代码调用。下面这段用 AVX2 手写数组求和的示例,核心循环已无需 unsafe:

rust 复制代码
#![forbid(unsafe_op_in_unsafe_fn)]

use std::arch::x86_64::*;

fn sum(slice: &[u32]) -> u32 {
    #[cfg(target_arch = "x86_64")]
    if is_x86_feature_detected!("avx2") {
        // SAFETY: 已检测到 avx2 特性
        return unsafe { sum_avx2(slice) };
    }

    slice.iter().sum()
}

#[target_feature(enable = "avx2")]
fn sum_avx2(slice: &[u32]) -> u32 {
    let (prefix, middle, tail) = unsafe { slice.align_to::<__m256i>() };

    let mut sum = prefix.iter().sum::<u32>() + tail.iter().sum::<u32>();

    let mut base = _mm256_setzero_si256();
    for e in middle {
        base = _mm256_add_epi32(base, *e);
    }

    let base: [u32; 8] = unsafe { std::mem::transmute(base) };
    sum += base.iter().sum::<u32>();

    sum
}

asm! 跳转到 Rust 代码

内联汇编 asm! 现可跳转至 Rust 代码中的标号块,使得在内核或硬件交互场景下的低级优化更灵活:

rust 复制代码
unsafe {
    asm!(
        "jmp {}",
        label {
            println!("Jumped from asm!");
        }
    );
}

详细说明参见 the reference。

在 trait 定义中精确捕获泛型 / 生命周期(+ use<...>) 本版本稳定了在 trait 方法返回类型为 impl Trait 时,显式指定应捕获的泛型与生命周期:

rust 复制代码
trait Foo {
    fn method<'a>(&'a self) -> impl Sized;

    // 反糖后:
    // type Implicit1<'a>: Sized;
    // fn method_desugared<'a>(&'a self) -> Self::Implicit1<'a>;

    fn precise<'a>(&'a self) -> impl Sized + use<Self>;

    // 反糖后:
    // type Implicit2: Sized;
    // fn precise_desugared<'a>(&'a self) -> Self::Implicit2;
}

稳定 API 一览

  • Vec::extract_if
  • vec::ExtractIf
  • LinkedList::extract_if
  • linked_list::ExtractIf
  • <[T]>::split_off
  • <[T]>::split_off_mut
  • <[T]>::split_off_first
  • <[T]>::split_off_first_mut
  • <[T]>::split_off_last
  • <[T]>::split_off_last_mut
  • String::extend_from_within
  • os_str::Display
  • OsString::display
  • OsStr::display
  • io::pipe
  • io::PipeReader
  • io::PipeWriter
  • impl From for OwnedHandle
  • impl From for OwnedHandle
  • impl From for Stdio
  • impl From for Stdio
  • impl From for OwnedFd
  • impl From for OwnedFd
  • Box<MaybeUninit>::write
  • impl TryFrom<Vec> for String
  • <*const T>::offset_from_unsigned
  • <*const T>::byte_offset_from_unsigned
  • <*mut T>::offset_from_unsigned
  • <*mut T>::byte_offset_from_unsigned
  • NonNull::offset_from_unsigned
  • NonNull::byte_offset_from_unsigned
  • ::cast_signed
  • NonZero::::cast_signed。
  • ::cast_unsigned。
  • NonZero::::cast_unsigned。
  • ::is_multiple_of
  • ::unbounded_shl
  • ::unbounded_shr
  • ::unbounded_shl
  • ::unbounded_shr
  • ::midpoint
  • ::from_utf8
  • ::from_utf8_mut
  • ::from_utf8_unchecked
  • ::from_utf8_unchecked_mut 这些以前稳定的 API 现在在 const 上下文中也很稳定:
  • core::str::from_utf8_mut
  • <[T]>::copy_from_slice
  • 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
  • char::is_digit
  • char::is_whitespace
  • <[[T; N]]>::as_flattened
  • <[[T; N]]>::as_flattened_mut
  • String::into_bytes
  • String::as_str
  • String::capacity
  • String::as_bytes
  • String::len
  • String::is_empty
  • String::as_mut_str
  • String::as_mut_vec
  • Vec::as_ptr
  • Vec::as_slice
  • Vec::capacity
  • Vec::len
  • Vec::is_empty
  • Vec::as_mut_slice
  • Vec::as_mut_ptr

移除 i586-pc-windows-msvc 目标

Tier 2 目标 i586-pc-windows-msvc 已被移除。它与更常用的 Tier 1 目标 i686-pc-windows-msvc 的唯一区别是 不要求 SSE2,但 Windows 10(所有 windows 目标的最低系统要求,win7 目标除外)本身就需要 SSE2。

请将原有项目迁移至 i686-pc-windows-msvc。详见 Major Change Proposal。

其它改动 更多 Rust / Cargo / Clippy 变化请查看 everything that changed in Rust, Cargo, and Clippy。

1.87.0 的贡献者 众多贡献者共同缔造了 Rust 1.87.0。没有你们就没有今天的发布,衷心感谢!

相关推荐
mit6.8242 小时前
rust等于C++的最佳实践
rust
初恋叫萱萱10 小时前
基于 Rust 与 DeepSeek 构建高性能 Text-to-SQL 数据库代理服务
数据库·sql·rust
鸿乃江边鸟11 小时前
Spark Datafusion Comet 向量化Rust Native--执行Datafusion计划
大数据·rust·spark·native
鸿乃江边鸟1 天前
Spark Datafusion Comet 向量化Rust Native--创建Datafusion计划
rust·spark·native
咸甜适中1 天前
rust的docx-rs库,自定义docx模版批量分页生成一个docx文档(方便打印)(逐行注释)
rust·办公自动化·docx-rs
Vallelonga1 天前
Rust Option.as_ref() 方法
开发语言·rust
大卫小东(Sheldon)2 天前
GIM 2.0 发布:真正让 AI 提交消息可定制、可控、可项目级优化
git·rust·gim
roamingcode2 天前
我是如何 Vibe Coding,将 AI CLI 工具从 Node.js 迁移到 Rust 并成功发布的
人工智能·rust·node.js·github·claude·github copilot
初恋叫萱萱3 天前
构建高性能生成式AI应用:基于Rust Axum与蓝耘DeepSeek-V3.2大模型服务的全栈开发实战
开发语言·人工智能·rust
superman超哥4 天前
Serde 性能优化的终极武器
开发语言·rust·编程语言·rust serde·serde性能优化·rust开发工具