如何在 rust 中模式匹配选项?当前代码不断恐慌

How can I pattern match Option in rust? Current code keeps panicking

我正在用 Rust 开发一个简单的二进制搜索算法。它 return 是一个 Option<usize>,我正在尝试对 return 值进行模式匹配。我的代码目前在 None 路径上失败。我很清楚我没有正确使用关键字。谁能解释我做错了什么?

下面的代码和输出。

代码:

fn find_index( arr: &[usize], find: usize) -> Option<usize> {
   let length = arr.len();
   let mut half = length / 2;
   let mut hind = length - 1;
   let mut lind = 0;
   let mut current = arr[half];

   while  lind <= hind {
       if current == find {
           return Some(half);
       }
       else if current < find{
           lind = half + 1;
       }
       else if current > find {
           hind = half - 1;
       }
        half = (hind + lind) / 2;
        current = arr[half];
   }
   return None;
}

fn grab_array_index(my_arr : &[usize], find: usize) -> usize{ 
    return my_arr.iter()
    .position(|&x| x == find)
    .unwrap();
}

fn main() 
{
    let mut arr = vec![1,2,3,4,5,6];
    let mut find = 3;

    println!("Index of {} is {}", find , grab_array_index(&arr, find));
    match find_index(&arr, find) {
        Some(p) => println!("Here ya go! {}", p),
        None => println!("not in the array >:("),
    }

    arr = vec![1,3,5,7,9,11,13,15,17,19];
    find = 17;

    println!("Index of {} is {}", find , grab_array_index(&arr, find));
    match find_index(&arr, find) {
        Some(p) => println!("Here ya go! {}", p),
        None => println!("not in the array >:("),
    }

    arr = vec![1,3,5,7,9,11,13,15,17,19];
    find = 18;

    println!("Index of {} is {}", find , grab_array_index(&arr, find));
    match find_index(&arr, find) {
        Some(p) => println!("Here ya go! {}", p),
        None => println!("not in the array >:("),
    }
}

输出:

Index of 3 is 2
Here ya go! 2
Index of 17 is 8
Here ya go! 8
thread 'main' panicked at 'called `Option::unwrap()` on a `None` value', binary_search.rs:27:6
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace

这是恐慌,因为在调用 find_index(&arr, find) 之前,在 find == 18 处,您调用了 grab_array_index,其中调用了 unwrap。由于 18 不在 arr 中,grab_array_index 在解包时出现恐慌。通过删除对 unwrap.

的调用,考虑让该函数 return 和 Option<usize> 一起使用

我假设您这样做是出于教育目的,因此我建议您在对自己的解决方案感到满意时检查 sourcestd 的二分搜索以查看他们如何利用语言特性来概括算法并使其更高效。