如何修复Rust嵌套结构体的生命周期问题?代码报错求助
问题原因与解决方法
为什么需要指定生命周期?
Tokenizer结构体定义时明确带有生命周期参数<'a>,它的string字段是一个引用,这意味着每个Tokenizer实例的有效性都和它所引用的数据的生命周期绑定。在Parser结构体中直接声明tokenizer: Tokenizer时,Rust无法确定这个Tokenizer的生命周期参数应该关联到哪里——它引用的是Parser自己的string字段,所以必须给Parser也引入生命周期参数,把两个字段的生命周期关系明确下来。
具体修改方法
给Parser添加生命周期参数,并将Tokenizer的生命周期与Parser绑定,确保Tokenizer引用的string生命周期和Parser实例一致。修改后的parser.rs代码如下:
pub struct Parser<'a> { string: String, tokenizer: Tokenizer<'a>, } impl<'a> Parser<'a> { pub fn new(string: String) -> Self { Parser { string, tokenizer: Tokenizer::new(&string), } } }
代码说明
Parser<'a>中的'a生命周期参数,用来关联tokenizer字段的生命周期和Parser实例的生命周期。Tokenizer<'a>明确表示这个Tokenizer引用的数据(也就是Parser的string字段)的生命周期和Parser一致。- 因为
Parser拥有string的所有权,只要Parser实例存在,string就不会被销毁,Tokenizer的引用就始终有效,不会出现悬垂引用的问题。
内容的提问来源于stack exchange,提问作者Axel
相关产品推荐
相关产品推荐

