Hi, I wrote a simple binary search program which accept Slice argument. And I want to use AsRef to accept Vec/Array/Slice argument. I followed compiler suggestion to add "ExactSizeIterator" trait and compile failed. Any suggestion? Thanks!
fn add_option_usize(a: &Option<usize>, b: &Option<usize>) -> Option<usize> {
if a.is_none() || b.is_none() {
return None;
} else {
return Some(a.unwrap() + b.unwrap());
}
}
// array can be Vec, Array, Slice
//pub fn find(array: &[i32], key: i32) -> Option<usize> {
pub fn find<T: ExactSizeIterator + AsRef<[i32]>>(array: T, key: i32) -> Option<usize> {
match array.len() {
0 => None,
_ => {
let mid = array.len() / 2;
if array[mid] == key {
Some(mid)
} else if array[mid] > key {
find(&array[0..mid], key)
} else {
add_option_usize(&Some(mid + 1), &find(&array[mid + 1..], key))
}
}
}
}
error[E0608]: cannot index into a value of type `T`
--> src\lib.rs:16:16
|
16 | if array[mid] == key {
| ^^^^^^^^^^