"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 中的一个巧妙的小技巧是,当你从一个表达式中跳出时(通过 return
、break
等),你实际上不需要为此提供一个值表达。在这种情况下,您可以 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,
};
}
我正在尝试实现一个“转换”函数,该函数采用非复制枚举值并根据参数对其进行修改,但某些参数不执行任何操作。一个简化的例子是:
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 中的一个巧妙的小技巧是,当你从一个表达式中跳出时(通过 return
、break
等),你实际上不需要为此提供一个值表达。在这种情况下,您可以 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,
};
}