首页 > 解决方案 > 将可变引用“移动”到自身中

问题描述

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

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被分配给它自己,所以它保持不变并且不应该移动任何东西,但是编译器不承认这一点。

如何通过分配给匹配表达式来实现这样的模式?

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

标签: rustmoveborrow-checker

解决方案


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

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,
    };
}

推荐阅读