如何在Rust中修改枚举值后返回枚举变体的引用?
解决方案
你要实现的功能完全可行。
报错原因
- 你在
*self = B(s);这一行已经将本地变量s的所有权转移到了self持有的枚举成员中,后续再对s取引用属于访问已被移动的变量,触发E0382错误。 - 本地变量
s是在当前match分支的作用域内定义的,分支执行结束就会被销毁,直接返回s的引用会产生悬垂引用,触发E0515错误。
修复代码
修改思路为:完成枚举变体转换后,直接从self中获取字符串的引用即可,不需要引用本地变量:
enum Foo { A(i32), B(String), } use Foo::*; impl Foo { fn get_string(&mut self) -> &str { // 若当前为A变体,先转换为B变体 if let A(i) = self { *self = B(i.to_string()); } // 此时self必然为B变体,直接返回内部字符串引用 match self { B(s) => s.as_str(), A(_) => unreachable!("枚举已提前转换为B变体,不会进入该分支"), } } }
补充说明
如果使用Rust 1.65及以上版本,还可以用let-else语法简化代码,避免显式写match分支:
impl Foo { fn get_string(&mut self) -> &str { if let A(i) = self { *self = B(i.to_string()); } let B(s) = self else { unreachable!() }; s } }
内容的提问来源于stack exchange,提问作者rambi
相关产品推荐
相关产品推荐

