如何在 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>
一起使用
我假设您这样做是出于教育目的,因此我建议您在对自己的解决方案感到满意时检查 source 的 std
的二分搜索以查看他们如何利用语言特性来概括算法并使其更高效。
我正在用 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
.
Option<usize>
一起使用
我假设您这样做是出于教育目的,因此我建议您在对自己的解决方案感到满意时检查 source 的 std
的二分搜索以查看他们如何利用语言特性来概括算法并使其更高效。