Rust中如何为枚举的结构体类型变体字段赋值?
解决方案
你当前定义的枚举C的A、B是无关联值的单元变体,和你定义的结构体A、B没有绑定关系,自然无法访问结构体字段。需要先调整枚举定义,让变体持有对应结构体的实例,再通过模式匹配拿到结构体的可变引用即可完成字段赋值。
完整可运行示例代码如下:
#[derive(Debug)] pub struct A { val1: i32, } #[derive(Debug)] pub struct B { val2: i32, } #[derive(Debug)] enum C { // 变体显式持有对应结构体的实例 A(A), B(B), } fn main() { // 初始化枚举时绑定对应结构体的实例 let mut x = C::A(A { val1: 0 }); println!("修改前的X: {:?}", x); // 模式匹配确认变体后,拿到结构体可变引用修改字段 if let C::A(ref mut a_instance) = x { a_instance.val1 = 10; } println!("修改后的X: {:?}", x); }
操作要点
- 枚举变体除了上述元组写法,也可以用命名字段的写法,比如
A { inner: A },访问时对应调整匹配逻辑即可。 - 修改枚举内关联的结构体字段必须先做模式匹配,是Rust的安全机制要求,避免枚举为其他变体时访问不存在的字段引发错误。
- 如果需要更简便的调用方式,可以给枚举封装赋值方法,示例如下:
impl C { // 尝试给val1赋值,返回Result标识是否赋值成功(枚举不是A变体时返回Err) fn set_val1(&mut self, val: i32) -> Result<(), ()> { match self { C::A(a) => { a.val1 = val; Ok(()) } _ => Err(()) } } }
封装完成后直接调用x.set_val1(10)即可完成赋值操作。
内容的提问来源于stack exchange,提问作者Coder
相关产品推荐
相关产品推荐

