首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法更改枚举的一个值,因为它是不可变变量的重新分配

无法更改枚举的一个值,因为它是不可变变量的重新分配
EN

Stack Overflow用户
提问于 2016-10-07 13:34:28
回答 1查看 679关注 0票数 4

我有包含变量的枚举:

代码语言:javascript
复制
enum Asymmetric {
    One(i32),
    Two(i32, i32),
}

我只想改变一个已经存在的枚举的一个字段,而不重新分配整个枚举。我的代码(游乐场):

代码语言:javascript
复制
// Does not compile
fn main() {
    let two = Asymmetric::Two(4, 5);
    let mut vec = vec![two];
    foo(&mut vec[0]);
}

fn foo(baa: &mut Asymmetric) {
    match baa {
        &mut Asymmetric::Two(x0, x1) => {
            x0 = 6;
        }
        _ => {}
    }
}

这将导致此错误:

代码语言:javascript
复制
error[E0384]: re-assignment of immutable variable `x0`
  --> src/main.rs:16:13
   |
15 |         &mut Asymmetric::Two(x0, x1) => {
   |                              -- first assignment to `x0`
16 |             x0 = 6;
   |             ^^^^^^ re-assignment of immutable variable
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-10-07 13:39:03

由于"match人机工程学“(在Rust 1.26,建议在此中引入),您可以编写如下代码:

代码语言:javascript
复制
fn foo(baa: &mut Asymmetric) {
    match baa {
        Asymmetric::Two(x0, _) => {
            *x0 = 6;
        }
        _ => {}
    }
}

因为baa是一个可变引用,但是您要匹配的模式(Asymmetric::Two(x0, _))不是,所以名称x0自动绑定为可变引用。

您还可以使用ref mut手动完成此操作。请参阅此工作代码(游乐场):

代码语言:javascript
复制
fn foo(baa: &mut Asymmetric) {
    match *baa {
        Asymmetric::Two(ref mut x0, _) => {
            *x0 = 6;
        }
        _ => {}
    }
}

一些与错误无关但提高代码质量的小更改:

  • 通常,您可以(使用*)执行matched-on值,而不是将&&mut添加到匹配的每个模式中。
  • 如果不需要绑定到名称,则应使用_作为名称占位符。

在您的例子中,您可以使用if let进一步简化代码。每当您只对一个match-case感兴趣时,就应该使用if let

代码语言:javascript
复制
fn foo(baa: &mut Asymmetric) {
    if let Asymmetric::Two(x0, _) = baa {
        *x0 = 6;
    }
}
票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39918574

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档