Я думаю, что проблема с существующим кодом в том, что Foo
потребляет Option
, в то время как ваше совпадение получает ссылку на Option
. Они должны соответствовать. Есть несколько подходов, которые будут работать здесь.
- Make
Foo
и совпадение оба используют значения. Это означает, что вы удаляете ref
на спичках. Вы не сможете использовать значение Person
после матча, так как оно будет разбито на составляющие части.
fn Foo(x: Option<String>) {
println!("{:?}", x);
}
// ...
match x {
Some(Person {
name: a @ Some(_),
lastname: b @ _,
}) => Foo(a),
_ => {}
}
Make
Foo
и совпадение оба используют ссылки. Вы сохраняете ссылку на совпадение, но добавляете
&
к аргументу
Foo
.
fn Foo(x: &Option<String>) {
println!("{:?}", x);
}
// ...
match x {
Some(Person {
name: ref a @ Some(_),
lastname: ref b @ _,
}) => Foo(a),
_ => {}
}
Клонируйте
a
, прежде чем передать его
Foo
.
Foo
и шаблон совпадения не меняется, но способ, которым вы звоните
Foo
, меняется незначительно
fn Foo(x: Option<String>) {
println!("{:?}", x);
}
// ...
match x {
Some(Person {
name: ref a @ Some(_),
lastname: ref b @ _,
}) => Foo(a.clone()),
_ => {}
}
Конечно, в вашем конкретном случае вам вообще не нужно использовать сопоставление с шаблоном Вы можете просто использовать некоторые инструменты, которые уже существуют в Option
, например map
.
x.map(|p| Foo(p.name));