"Move" 自身的可变引用

"Move" mutable reference into itself

我正在尝试实现一个“转换”函数,该函数采用非复制枚举值并根据参数对其进行修改,但某些参数不执行任何操作。一个简化的例子是:

enum NonCopy {
    A,
    B,
    C
}

fn transform(to_transfrom: &mut NonCopy, param: u32) -> () {
    *to_transfrom = match param {
        // transformations
        1 => NonCopy::A,
        2 => NonCopy::B, 
        // retains the value
        _ => *to_transfrom
    };
}

我知道,由于 NonCopy 没有实现 Copy 特性,因此无法将 to_transform 中的值移出,但是如果 param 既不是 1 也不是 2 的值*to_transform 已分配给自身,因此它保持不变,不应移动任何内容,但编译器无法识别。

如何通过对匹配表达式的赋值来实现这种模式?

我知道我可以在匹配表达式中赋值,但非示例版本更大,我不想重复这么多代码,而且它非常难看。

Rust 中的一个巧妙的小技巧是,当你从一个表达式中跳出时(通过 returnbreak 等),你实际上不需要为此提供一个值表达。在这种情况下,您可以 return 来自匹配臂而不提供值:

enum NonCopy {
    A,
    B,
    C
}

fn transform(to_transfrom: &mut NonCopy, param: u32) -> () {
    *to_transfrom = match param {
        // transformations
        1 => NonCopy::A,
        2 => NonCopy::B, 
        // retains the value
        _ => return,
    };
}