如何在 Option<String> 的向量中查找元素
How to find an element in vector of Option<String>
作为 Rust 新手,我在使用“查找”函数查找 Option 向量中的元素时遇到了问题:
#[derive(Debug)]
struct MyStruct {
name: Option<String>,
data: Option<String>
}
fn main() {
let my_vec=vec![
MyStruct{
name:Some(String::from("name1")),
data:Some(String::from("data1"))
},
MyStruct{
name:Some(String::from("name2")),
data:Some(String::from("data2"))
}
];
let search_string = String::from("name2");
let found_record=my_vec.iter().find(|s| s.name == Some(search_string));
println!("{:?}", found_record);
}
由于比较 s.name == Some(search_string) 缺少 Copy 特征,此代码无法编译。 “查找”表达式的正确方法是什么?
一种选择是将您的 search_string
和结构字段都转换为 Option<&str>
以进行比较:
let found_record = my_vec.iter().find(
|s| s.name.as_deref() == Some(search_string.as_ref()));
错误原因
请注意,您正在通过移动 String
.
在闭包内使用 Some()
来构建 Option
一些解决方案
- 你可以通过在它之前构造
Option
来避免移动并通过不可变引用进行闭包捕获,如下所示
let search_string = Some(String::from("name2"));
let found_record=my_vec.iter().find( |s| s.name == search_string);
- 或者在
Option
里面输入,如下
let search_string = String::from("name2");
let found_record=my_vec.iter().find(
|s| match &s.name{Some(name)=> name, _ => return false,} == &search_string
);
我不喜欢这种方法
let found_record = my_vec.iter().find(
|s| s.name.as_deref() == Some(search_string.as_ref()));
因为它每次迭代都会生成一个新的 Some()
,除非编译器进行了优化。
作为 Rust 新手,我在使用“查找”函数查找 Option 向量中的元素时遇到了问题:
#[derive(Debug)]
struct MyStruct {
name: Option<String>,
data: Option<String>
}
fn main() {
let my_vec=vec![
MyStruct{
name:Some(String::from("name1")),
data:Some(String::from("data1"))
},
MyStruct{
name:Some(String::from("name2")),
data:Some(String::from("data2"))
}
];
let search_string = String::from("name2");
let found_record=my_vec.iter().find(|s| s.name == Some(search_string));
println!("{:?}", found_record);
}
由于比较 s.name == Some(search_string) 缺少 Copy 特征,此代码无法编译。 “查找”表达式的正确方法是什么?
一种选择是将您的 search_string
和结构字段都转换为 Option<&str>
以进行比较:
let found_record = my_vec.iter().find(
|s| s.name.as_deref() == Some(search_string.as_ref()));
错误原因
请注意,您正在通过移动 String
.
Some()
来构建 Option
一些解决方案
- 你可以通过在它之前构造
Option
来避免移动并通过不可变引用进行闭包捕获,如下所示
let search_string = Some(String::from("name2"));
let found_record=my_vec.iter().find( |s| s.name == search_string);
- 或者在
Option
里面输入,如下
let search_string = String::from("name2");
let found_record=my_vec.iter().find(
|s| match &s.name{Some(name)=> name, _ => return false,} == &search_string
);
我不喜欢这种方法
let found_record = my_vec.iter().find(
|s| s.name.as_deref() == Some(search_string.as_ref()));
因为它每次迭代都会生成一个新的 Some()
,除非编译器进行了优化。