Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust 我如何使用match来修改可变变量,以确保其非穷举且不需要克隆?_Rust - Fatal编程技术网

Rust 我如何使用match来修改可变变量,以确保其非穷举且不需要克隆?

Rust 我如何使用match来修改可变变量,以确保其非穷举且不需要克隆?,rust,Rust,当使用match来修改可变变量时,我还没有找到一种方法来确保match的使用不会穷尽,也不需要clone struct Stuff { num: u32, thing: bool, } enum Bar { Nothing, SomeStuff(Stuff), AlsoNothing, } fn main() { let mut things = vec![Bar::SomeStuff(Stuff { num: 2,

当使用
match
来修改可变变量时,我还没有找到一种方法来确保
match
的使用不会穷尽,也不需要
clone

struct Stuff {
    num: u32,
    thing: bool,
}

enum Bar {
    Nothing,
    SomeStuff(Stuff),
    AlsoNothing,
}

fn main() {
    let mut things = vec![Bar::SomeStuff(Stuff {
        num: 2,
        thing: false,
    })];

    for x in things.iter_mut() {
        *x = match *x {
            Bar::Nothing => Bar::AlsoNothing,
            Bar::AlsoNothing => Bar::SomeStuff(Stuff {
                num: 3,
                thing: true,
            }),
            Bar::SomeStuff(thing) => panic!("not sure"),
        }
    }
}
错误[E0507]:无法移出借用的内容
-->src/main.rs:19:20
|
19 |*x=匹配*x{
|^^无法移出借用的内容
...
25 | Bar::something(thing)=>恐慌!(“不确定”),
|-----提示:要防止移动,请使用'ref thing'或'ref mut thing'`
我的意图是编写
Bar::SomeStuff(thing)=>Bar::SomeStuff(thing)
,并有效地保持它不变,但我无法通过借阅或引用进行操作

Bar::something(thing.clone())
可以工作,但是复制一个大结构可能会非常昂贵


删除
*x=
并更改为
()
也可以工作,但我只返回
枚举,因此让编译器检查返回类型是我希望保留的内容。

如果您想不改变传递值,只需捕获与变量匹配的内容并将其传递回去,例如

fn foo(a: u32) -> u32 {
    match a {
        0 => 1,
        1 => 2,
        e => e,
    }
}
在您的情况下,我会将变量赋值移动到匹配臂中

for x in things.iter_mut() {
    match x {
        Bar::Nothing => *x = Bar::AlsoNothing,
        Bar::AlsoNothing => *x = Bar::SomeStuff(Stuff { num: 3, thing: true }),
        _ => {},
    }
}

我知道第一个建议我已经排除了,因为它不够明确,如果我更改了枚举,那么它仍然会编译,而不会给出进一步的警告(对不起,我忘了我已经考虑过了).第二个肯定是我喜欢的,我真希望我能保留对匹配臂的赋值。这感觉是一种更自然的描述方式,比克隆更好。但是编译器确保涵盖了每种情况,这使我比第一个更好