显式声明Rust生命周期时遇`dropped here while still borrowed`错误求助
问题分析与解决方案
核心结论
StringWrapperWrapper<'_>中的'_对应的是函数内局部变量wrapper的生命周期,而非&self的'a。显式化时需要引入一个独立的生命周期来表示这个局部变量的存活时长。
为什么用'a会报错?
先看你的结构体定义:
struct StringWrapperWrapper<'a>(&'a StringWrapper<'a>);
这个结构体要求内部的StringWrapper引用,和StringWrapper自身持有的str引用共享同一个生命周期'a。当你把StringWrapperWrapper<'a>作为FnOnce的参数时,编译器会判定:
StringWrapperWrapper内部的&wrapper必须存活到'a(即self的生命周期)- 但
wrapper是函数内的局部变量,生命周期只到函数末尾(}处销毁),远短于'a
因此会抛出"被借用值生命周期不足"的错误。
正确的显式生命周期写法
需要引入一个新的独立生命周期'b,用来表示局部变量wrapper的存活时长,代码如下:
impl ContainingAValue { fn do_something_with_wrapper_wrapper<'a, 'b, F>(&'a self, f: F) where F: FnOnce(StringWrapperWrapper<'b>) -> (), { let wrapper = StringWrapper(&self.value); let tmp = StringWrapperWrapper(&wrapper); f(tmp) } }
这里的'b会被编译器自动推断为wrapper的生命周期——从变量声明到函数结束前的这段时间,刚好满足FnOnce的调用需求:f(tmp)执行时wrapper仍存活,执行完毕后wrapper即可被销毁。
补充说明
原始代码中使用'_时,编译器会自动完成这个生命周期推断,所以能正常编译。显式化时必须明确这个局部生命周期,不能强行绑定到'a,否则会违反Rust的借用规则。
内容的提问来源于stack exchange,提问作者Xavier Detant
相关产品推荐
相关产品推荐

