
Rust 编译器 E0090 错误码详解泛型函数生命周期参数数量错误的诊断与修复【免费下载链接】rustEmpowering everyone to build reliable and efficient software.项目地址: https://gitcode.com/GitHub_Trending/ru/rustE0090 是 Rust 编译器历史上用于报告“提供的生命周期参数过少”的错误码如今该场景已被统一的 E0107泛型参数数量错误诊断体系取代。本文基于 Rust 仓库中的官方错误码文档 E0090.md完整还原该错误的触发场景与修复方式并结合 rustc_hir_analysis 中现行的诊断实现讲清楚编译器如何检测、报告并自动建议补齐缺失的生命周期参数帮助你在遇到 “wrong number of lifetime arguments” 一类报错时快速定位问题。E0090 的定位一个已退役但仍有参考价值的错误码E0090.md 开篇即声明Note: this error code is no longer emitted by the compiler.也就是说在当前仓库对应的 rustc 版本中编译器不再输出E0090这个错误码本身。它原本覆盖的场景是你为泛型函数或类型显式提供生命周期参数时给的个数比声明的少too few lifetime arguments。这一类“参数数量不匹配”的诊断现在统一归入 E0107即 “wrong number of type / lifetime arguments” 错误族。这一点在源码中可以直接印证wrong_number_of_generic_args.rs 中的诊断构造器into_diag会无条件地对所有“泛型参数数量不对”的场景调用err.code(E0107)第 1158 行。因此如果你在阅读旧资料、旧 issue 或第三方教程时看到 E0087E0090 这一片错误码它们的文档示例如今都标注为compile_fail,E0107如 E0089.md应理解为它们是 E0107 的历史前身实际编译输出中以 E0107 为准。典型触发场景生命周期参数给少了E0090 文档给出的原始示例如下该代码块在当前编译器下会报 E0107fn fooa: b, b: a() {} fn main() { foo::static(); // error: wrong number of lifetime arguments: // expected 2, found 1 }这里有几个关键知识点值得展开fn fooa: b, b: a()声明了两个生命周期参数a和b并带有相互的生命周期边界约束a: b表示a至少与b同长b: a同理。从源码结构看这两个约束在此例中并不影响错误本身——错误的核心是参数个数声明了 2 个生命周期参数调用处 turbofish 里只写了 1 个。显式写 turbofish 时生命周期参数必须“一个不少”地全部给出。这与类型参数不同类型参数允许用_占位让编译器推断见 E0089.md 中的foo::_, f64(x)写法而生命周期参数不支持_占位因为具体生命周期如static或某个命名生命周期必须由调用者明确指定。编译器报错信息形如wrong number of lifetime arguments: expected 2, found 1会同时指出期望数量和实际数量定位非常直接。修复方式补齐全部生命周期参数文档给出的正确写法如下fn fooa: b, b: a() {} fn main() { foo::static, static(); }即把两个生命周期参数逐一、按声明顺序填齐。实践中还有两条可选思路直接省略 turbofish如果调用点没有歧义多数情况下可以完全不写::..., ...让编译器在类型检查阶段推断具体生命周期文档示例中刻意写出 turbofish 才触发数量检查。复用已有作用域中的生命周期若外层函数或类型已定义a、b等生命周期通常可以直接引用它们使调用与声明对齐。更复杂的“参数个数不匹配”场景如类型参数给多/给少、对不带泛型的函数写f::static()等在 E0107.md 中有更完整的错误与正确对照示例可作为 E0090 场景的自然延伸参考。现行诊断实现从 HIR 类型降低到诊断建议E0090 对应的“生命周期参数缺失”检测现行实现位于 HIR 类型降低type lowering阶段核心逻辑集中在 wrong_number_of_generic_args.rs。下面按检测→报告→建议三层梳理其工作机制。1. 缺失检测GenericArgsInfo::MissingLifetimes诊断上下文封装在WrongNumberOfGenericArgs结构体中第 10–33 行关键字段包括字段含义gen_params: ty::Generics被引用类型/函数“期望”的泛型参数gen_args: hir::GenericArgs用户在调用处实际“提供”的泛型参数gen_args_info: GenericArgsInfo缺失/冗余的具体类别与数量angle_brackets: AngleBrackets调用处是否有...、是否为省略形式其中GenericArgsInfo第 50–86 行枚举了四种情形E0090 的场景正对应MissingLifetimes { num_missing_args }——生命周期参数缺失 N 个。同族的还有ExcessLifetimes生命周期参数给多了、MissingTypesOrConsts和ExcessTypesOrConsts类型/常量参数缺失或冗余且后两者额外记录默认参数数量num_default_params以支持带默认泛型参数的类型。AngleBrackets第 37–47 行则区分三种调用形态Missing完全没写尖括号如Bar而非BarTImplied没写尖括号但存在省略形式的隐式参数如生命周期省略推断产生的Available写了...E0090 示例的foo::static()即属此类。从源码结构看该诊断是在 rustc_hir_analysis 的类型降低流程中被触发组装的即编译器在把 HIR 类型路径解析为具体类型时比对声明与实参的数量差异。2. 错误消息与“定义位置”标注create_error_message第 506–543 行负责生成主消息当调用处写了尖括号时形如“该函数需要 N 个生命周期参数但提供了 M 个”当完全没写尖括号时则退化为更简洁的missing generics for ...。notify方法第 545–596 行会在标识符上标注expected N lifetime arguments并对已提供的参数逐个加下划线标注supplied M lifetime argument(s)。此外show_definition第 1093–1138 行会在报错处附带一条 note指向定义位置并列出声明的各参数名例如 “fn defined here, with 2 lifetime parameters:a,b”方便开发者确认自己到底漏填哪一个。3. 自动修复建议智能补齐缺失的生命周期最实用的部分是suggest路径。当检测到MissingLifetimes且调用处已有尖括号时suggest_adding_lifetime_args第 645–697 行会给出add missing lifetime argument(s)的代码修改建议若调用处完全没写尖括号则建议直接插入形如a, b的完整片段。建议填入哪些生命周期名由get_lifetime_args_suggestions_from_param_names第 327–433 行按以下优先级决定复用调用处已提供的生命周期如果 turbofish 里已经写了某个生命周期如static缺失的就直接复制它——这正是 E0090 场景下编译器可能提示补成static, static的原因建议_如果出错类型处于函数参数或可省略的返回值位置建议匿名生命周期建议static如果所在上下文是const、static、外部静态项或匿名常量等“item 级”位置借用外层泛型参数名沿 HIR 父节点向上查找最近的泛型声明借用其中的生命周期参数名回退到被引用类型的参数名若外层仍凑不够则直接用目标类型定义处的生命周期参数名填充。所有这些建议的适用性标记为Applicability::HasPlaceholders即编译器明示“建议中包含占位符请自行确认替换”体现了对生命周期这类强上下文相关推断的谨慎态度。相关错误码速查错误码文档原含义现状E0089E0089.md函数类型参数过少不再单独输出示例标注为E0107E0090E0090.md函数生命周期参数过少不再单独输出示例标注为E0107E0107E0107.md泛型参数类型/生命周期数量不正确现行统一错误码从错误码文档与诊断源码的对应关系可以推断E0087E0090 这一族“给多/给少类型或生命周期参数”的历史错误码在诊断重构后统一收敛为 E0107 并按GenericArgsInfo的四种情形细分提示但底层的检测逻辑与建议能力被完整保留并增强新增了按上下文推断建议值、提示把多余参数移到 trait 上等能力见 suggest_moving_args_from_assoc_fn_to_trait。实战要点小结看到wrong number of lifetime arguments: expected N, found M对照报错 note 中指向的定义位置数清声明的生命周期参数按声明顺序在 turbofish 中逐一补齐E0090 示例的正确写法是foo::static, static()。生命周期参数不能省略、不能用_占位这与时类型参数的_推断规则见 E0089 文档不同能省略 turbofish 时优先省略。优先接受编译器的add missing lifetime argument建议其建议值基于调用上下文智能生成复用已写参数、static、_或外层生命周期名但仍需人工确认语义正确。查旧资料遇到 E0087E0090一律按 E0107 理解以当前编译器输出为准。以上行为均以当前 rustc 源码为准适用于 compiler 目录下的主干实现未来版本若继续演进诊断例如hir_ty_lowering中对 E0107 误报的修复注释见 mod.rs 第 2542 行附近具体提示文案可能变化但“声明数量必须与显式提供的参数数量一致”这一核心规则不会改变。【免费下载链接】rustEmpowering everyone to build reliable and efficient software.项目地址: https://gitcode.com/GitHub_Trending/ru/rust创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考