我想在不使用任何克隆的情况下将旧变体的字段移动到新变体时更新枚举变体:
enum X {
X1(String),
X2(String),
}
fn increment_x(x: &mut X) {
*x = match *x {
X::X1(s) => X::X2(s),
X::X2(s) => X::X1(s),
}
}
Run Code Online (Sandbox Code Playgroud)
这并不工作,因为我们不能移动s的&mut X.
请不要建议实现enum X { X1, X2 }和使用struct S { variant: X, str: String }等等.这是一个简化的例子,想象在变体中有许多其他字段,并希望将一个字段从一个变量移动到另一个变体.
是否可以在&mut E<T>没有附加约束的情况下切换变量reference()的变量T,并且不使用不安全的代码?
也就是说,给定一个枚举:
enum E<T> {
VariantA(T),
VariantB(T)
}
Run Code Online (Sandbox Code Playgroud)
写这个的正确方法是什么:
let x: E<???> = E::VariantA(??);
change_to_variant_b(&mut x);
assert_eq!(x, E::VariantB(??));
Run Code Online (Sandbox Code Playgroud) 我想在可变借入中替换一个值; 将其中的一部分移动到新值中:
enum Foo<T> {
Bar(T),
Baz(T),
}
impl<T> Foo<T> {
fn switch(&mut self) {
*self = match self {
&mut Foo::Bar(val) => Foo::Baz(val),
&mut Foo::Baz(val) => Foo::Bar(val),
}
}
}
Run Code Online (Sandbox Code Playgroud)
上面的代码不起作用,并且可以理解的是,将值移出会self破坏它的完整性.但由于之后立即删除了该值,我(如果不是编译器)可以保证它的安全性.
有没有办法实现这个目标?我觉得这是一个不安全代码的工作,但我不确定这是如何工作的.