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