rust - 将可变引用“移动”到自身中
问题描述
我正在尝试实现一个“转换”函数,该函数采用非复制枚举值并根据参数对其进行修改,但某些参数什么也不做。一个简化的例子是:
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
等)时,你实际上不需要为那个表达式提供一个值。在这种情况下,您可以在不提供值的情况下从匹配臂返回:
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,
};
}
推荐阅读
- java - 无法在android中使用AlarmManager发送多个通知
- javascript - 如何模拟用于测试库的 DataTransfer 项目
- servicenow - AngularJS 材质到 ServiceNow 小部件
- date - 显示 5 周日期范围格式 DD/MM/YYYY 到 DD/MM/YYYY 的日期计算在画面中不起作用
- c# - 如何将变量中的值转换为数组索引
- pandas - 属性错误:Dataframe 对象没有属性 as_matrix
- javascript - Chart.JS 工具提示回调标签和标题 (v3.5)
- linux - 在搜索路径下的 .sh 文件中运行 .sql
- email - ansible tower "msg": "ntlm: 从服务器返回的 HTTP 响应错误。代码 403",
- python - 随着编辑器高度的增加,使 QTableView 的行扩展