Я хочу, чтобы приведенный ниже код работал, но поскольку 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
, развернуть и обернуть его по отдельности.