空函数为何引发Rust借用编译错误?与生命周期参数有关吗?
Rust借用编译错误:调用空函数后无法修改结构体字段
你的代码出现的编译错误和read_number的函数内容无关,核心问题是错误的生命周期参数约束导致的借用冲突。
问题分析
你在impl块中额外声明了两个生命周期't和'l,并指定'l: 't(即'l的生命周期长于't),同时让read_number接收&'l mut self作为参数。这意味着调用read_number后,self的可变借用会绑定到更长的'l周期上——而Lexer<'t>中的token字段是Token<'t>,它的生命周期依赖于更短的't。
编译器会认为:调用read_number后,整个self(包括self.token)被一个长生命周期的可变借用占据,后续尝试给self.token赋值时,这个长借用还未结束,因此触发"无法赋值,因为字段已被借用"的错误——哪怕read_number是空函数,编译器也会严格按照你声明的生命周期约束做检查。
修复方案
去掉impl块上多余的生命周期参数,直接使用Lexer本身的生命周期即可:
pub struct Lexer<'a> { input: String, token: Token<'a>, } #[derive(Debug, Copy, Clone)] pub struct Token<'a> { pub t: i32, pub literal: &'a str, } impl<'t> Lexer<'t> { pub fn next_token(&mut self) { self.read_number(); self.token = Token { t: 10, literal: "abc" }; } fn read_number(&mut self) { } }
修复说明
- 删除
impl上的'l生命周期和'l: 't约束,只保留Lexer自身的't生命周期 - 将
next_token和read_number的参数改为普通的&mut self,Rust会自动推导合适的借用生命周期,避免手动指定长生命周期导致的冲突
修改后,read_number对self的可变借用只会持续到函数调用结束,后续赋值self.token就不会再触发借用冲突。
内容的提问来源于stack exchange,提问作者hliu
相关产品推荐
相关产品推荐

