如何在 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()));

playground

错误原因

请注意,您正在通过移动 String.

在闭包内使用 Some() 来构建 Option

一些解决方案

  1. 你可以通过在它之前构造 Option 来避免移动并通过不可变引用进行闭包捕获,如下所示
let search_string = Some(String::from("name2"));
let found_record=my_vec.iter().find( |s| s.name == search_string);

  1. 或者在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(),除非编译器进行了优化。