是否可以将变量引用的变量转换为枚举?

Doe*_*Doe 9 enums rust

是否可以在&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)

Mat*_* M. 7

我要在这里走的肢体,并说没有.


只需对签名进行微小的更改即可:

fn change_to_variant_b<T>(e: E<T>) -> E<T> {
    match e {
        E::VariantA(t) => E::VariantB(t),
        E::VariantB(t) => E::VariantB(t),
    }
}
Run Code Online (Sandbox Code Playgroud)

有可能使用unsafe:

fn change_to_variant_b<T>(e: &mut E<T>) {
    use std::ptr;

    unsafe {
        match ptr::read(e as *const _) {
            E::VariantA(t) => ptr::write(e as *mut _, E::VariantB(t)),
            E::VariantB(t) => ptr::write(e as *mut _, E::VariantB(t)),
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

可以使用其他边界(Default,或Clone):

fn change_to_variant_b<T: Default>(e: &mut E<T>) {
    match std::mem::replace(e, E::VariantA(T::default())) {
        E::VariantA(t) => e = E::VariantB(t),
        E::VariantB(t) => e = E::VariantB(t),
    }
}
Run Code Online (Sandbox Code Playgroud)