【发布时间】:2018-11-21 22:57:50
【问题描述】:
我希望下面的代码能够工作,但由于map() 拥有Option 的所有权,而且Option 似乎没有clone() 函数,因此以下代码无法编译。
fn main() {
struct ItemA {
a: String,
b: String,
}
let foo = Some(ItemA {
a: "A String".to_owned(),
b: "B String".to_owned(),
});
// OR
// let foo = None;
let opA: Option<String> = foo.map(|c| c.a);
let opB: Option<String> = foo.map(|c| c.b);
}
error[E0382]: use of moved value: `foo`
--> src/main.rs:15:31
|
14 | let opA: Option<String> = foo.map(|c| c.a);
| --- value moved here
15 | let opB: Option<String> = foo.map(|c| c.b);
| ^^^ value used here after move
|
= note: move occurs because `foo` has type `std::option::Option<main::ItemA>`, which does not implement the `Copy` trait
如果opA 可以拥有ItemA.a 的所有权(这样它就不必克隆字符串)并且opB 可以拥有ItemA.b 的所有权,那就太好了
这是否可以在不必使用 if 语句检查 Option 是 Some 或 None、打开包装并将其单独包装备份的情况下进行。
【问题讨论】:
-
Idiomatic Rust 使用
snake_case表示变量、方法、宏和字段;UpperCamelCase用于类型;SCREAMING_SNAKE_CASE用于静态和常量。请改用op_a/op_b。