You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

空函数为何引发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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 10:22:50