# Issue

As a simple exercise to learn Rust, I've decided to implement a simple binary search:

```
pub fn binary_search(arr: &[i32], key: i32) -> usize {
let min: usize = 0;
let max: usize = arr.len();
while max >= min {
let mid: usize = (max - min) / 2 as usize;
if key == arr[mid] {
mid as usize
}
if key < arr[mid] {
min = mid + 1;
continue;
}
max = mid - 1;
}
-1 as usize
}
#[cfg(test)]
mod tests {
use super::binary_search;
#[test]
fn binary_search_works() {
let arr: [i32; 8] = [1, 2, 3, 4, 5, 6, 7, 8];
let index: usize = binary_search(&arr, 2);
assert_eq!(1, index);
}
}
```

At build time, I get this error which I do not understand. What is the `()`

type? The variable `mid`

is always `usize`

but even with the `as`

cast I'm getting this compilation error:

```
error: mismatched types [E0308]
mid as usize
^~~~~~~~~~~~
help: run `rustc --explain E0308` to see a detailed explanation
note: expected type `()`
note: found type `usize`
```

# Solution

() is the *unit type*, analogous to a `void`

return type in other languages.

You're getting it here:

```
if key == arr[mid] {
mid as usize
}
```

Rust is expecting that if expression to return `()`

, but you're returning `usize`

for that expression. Since virtually everything in Rust is an expression, you can *usually* implicit return like you're trying to here, but in this specific case you can't because the `if`

expression is not the **only** expression in the `while`

expression. You could fix the immediate problem by using `return mid as usize;`

instead.

Answered By - Aurora0001 Answer Checked By - Clifford M. (PHPFixing Volunteer)

## 0 Comments:

## Post a Comment

Note: Only a member of this blog may post a comment.