如何编写以下代码?看起来绝对安全,但是我无法说服编译器。
匹配*self
的版本会显示错误:
error[E0507]: cannot move out of borrowed content
--> src/main.rs:8:16
|
8 | match (*self, y) {
| ^^^^^ cannot move out of borrowed content
与self
匹配的版本给出:
error[E0382]: use of moved value: `*self`
--> src/main.rs:17:26
|
8 | match (self, y) {
| ---- value moved here
...
17 | (*a * b, self)
| ^^^^ value used here after move
|
= note: move occurs because `self` has type `&'a mut Foo<'a>`, which does not implement the `Copy` trait
enum Foo<'a> {
Foo1(Option<&'a mut Foo<'a>>),
Foo2(i16),
}
impl<'a> Foo<'a> {
fn bar(&'a mut self, y: i16) -> (i16, &'a mut Foo<'a>) {
match (self, y) {
(&mut Foo::Foo1(Some(ref mut a)), b) if (b == 5) => {
return a.bar(y)
},
(&mut Foo::Foo2(ref mut a), b) if (b == 5) => {
print!("is five");
*a = (b + 42) as i16;
(*a * b, self)
},
ref mut x => {
print!("is not five!");
(y, self)
}
}
}
}
我觉得我需要一个如下所示的匹配臂,但它似乎不是有效的语法:
(ref mut f @ Foo::Foo1, b) if (b == 5) => {
print!("is five");
f.0 = b + 42;
(b, f)
}
error[E0532]: expected unit struct/variant or constant, found tuple variant `Foo::Foo1`
--> src/main.rs:24:30
|
24 | (ref mut f @ Foo::Foo1, b) if (b == 5) => {
| ^^^^^^^^^ not a unit struct/variant or constant
这是我尝试编写的deep_fetch_mut
的{{1}}的精简版本。目标是能够调用toml::Value
,该方法将返回对.deep_fetch_mut(vec!["aaa","bbb","ccc"])
中该值的可变引用。
这个问题是How can I pattern match a tuple containing a &mut enum and use the enum in the match arm?
的扩展答案 0 :(得分:0)
这似乎可以编译,但是非常丑陋。有没有一种方法可以简化此过程?
enum Foo<'a> {
Foo1(Option<&'a mut Foo<'a>>),
Foo2(i16),
}
impl<'a> Foo<'a> {
fn bar(&'a mut self, y: i16) -> (i16, &'a mut Foo<'a>) {
match (&mut *self, y) {
(Foo::Foo1(Some(ref mut a)), b) if (b == 5) => {
return a.bar(y)
},
(self2, c) => {
let n = match (&mut *self2 , c) {
(Foo::Foo2(ref mut a), b) if (b == 5) => {
print!("is five");
*a = (b + 42) as i16;
*a * b
},
ref mut x => {
print!("is not five!");
y
}
};
return (n, self2)
}
}
}
}