返回

文章详情

Rust项目目标:不可移动类型和保障析构函数

Hacker News2026年8月3日 06:42

不可移动类型和保障析构函数 元数据 联系人 @lcnr 状态 已接受 什么与为什么 让类型选择不被移动或遗忘,从而实现作用域生成、异步释放和默认固定 时间范围 2026-2027 路线图 只需添加异步 路线图 Rust for Linux 跟踪问题 [#635] 其他跟踪问题 [rust-lang/rust#149607] Zulip频道 #t-lang/move-trait [类型] 决策者 @lcnr [语言] 决策者 @jackh726 概要 我们建议引入新的特性,描述类型上可能的操作。今天,Rust假设所有类型都可以被移动(重新定位在内存中)并被遗忘(通过mem::forget)。我们将引入像Move和Forget这样的特性,使这些能力明确化,让类型选择退出。这遵循Sized层次结构工作的先例,放宽了所有类型具有编译时已知大小的假设。我们将在编译器中实现最小可行产品(MVP)、撰写RFC,并通过在Linux内核中的实际测试验证可行性。 动机 现状 Rust历史上假设所有值都可以被移动(重新定位在内存中)并被遗忘(通过mem::forget,而不运行析构函数)。这些假设被深深嵌入语言中:赋值移动值,mem::forget是安全的。但是,一些类型需要选择退出这些能力: 不可移动类型:许多异步future想要自引用,但自引用类型不能安全地移动。当前的解决方案是Pin,它将不可移动性编码为位置的属性,而不是类型的属性。这导致了显著的复杂性。正如《安全固定初始化问题》所描述的,Pin在将自引用类型安全编码到像Linux内核这样的系统中遇到困难。 保障析构函数:一些类型需要它们的析构函数运行。一个Transaction类型可能在清理之前需要commit()或rollback()。一个作用域任务句柄必须在作用域退出之前完成。但mem::forget是安全的,因此Rust无法保证析构函数的运行。这阻止了像异步的安全作用域生成等模式,其中生成的任务从父作用域借用。 我们提议的解决方法 我们提议用新的自动特性来概括Rust的类型系统,这些特性描述了类型上可能的操作。框架是积极的:特性表示能力。在基础层,类型可能没有特殊能力。然后我们在我们需要的东西上分层: Move:类型可以在内存中被重新定位。 Destruct:类型可以隐式地被删除(当超出作用域时运行析构函数)。 Forget:类型可以通过mem::forget被遗忘而不运行其析构函数。这遵循Sized层次结构工作的先例。正如那项工作放宽了“所有类型具有编译时已知大小”的假设以支持可扩展向量,这项工作放宽了“所有类型可以被移动”和“所有类型可以被遗忘”的假设。 Move特性将可移动性编码为类型的属性,而不是位置的属性: #[lang = "move"] unsafe auto trait Move { } 实现!Move的类型不能被移动,必须在其存在的整个过程中保持稳定地址。这比Pin更简单,因为不可移动性是类型属性,而不是位置属性。构造!Move类型将依赖于#t-lang/in-place-init中的工作。 Forget特性允许类型选择退出被遗忘: // 实现!Forget的类型必须运行其析构函数 unsafe impl !Forget for ScopedTaskHandle { } 通过!Forget,我们可以构建安全作用域生成:句柄的析构函数加入任务,并且因为句柄不能被遗忘,因此加入是有保障的。这解锁了在安全Rust中当前不可能的模式。 下一年工作项目 Move特性 让类型选择退出在内存中被重新定位,将不可移动性编码为类型属性,而不是位置属性。 任务负责人 注释 Move的编译器实现 @lcnr和@nia-e 撰写Move RFC @yoshuawuyts 在Linux内核中测试 @BennoLossin RfL是一个重要的Rust用户,使用了很多自引用的数据结构。 测试迭代器与!Move的交互 @yoshuawuyts 证明基于生成器的效果可以被转换为impl Trait + !Move,从而支持自引用,这是很重要的。 保障析构函数 探索让类型选择退出mem::forget,从而启用像安全异步作用域生成这样的模式。 任务负责人 注释 保障析构函数的设计探索 @nikomatsakis 探索特性层次选项及与现有特性的交互 今年具体不在范围内的内容是与更改或更新Future特性相关的内容。这是Rust中唯一依赖Pin的稳定特性,需要迁移方案才能使用Move。然而,依赖Pin并不是Future的唯一缺陷(还有1 + 2 + 10个其他问题),因此修复Future特性最好视为一个独立项目。团队请求 团队支持水平 注释 [语言] 大 需要进行设计会议来讨论设计 [类型] 大 参与实现和审查

赞助内容

NordVPN Next-gen Antivirus

本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。

请我喝杯咖啡