作为学习Rust的简单练习,我决定实施简单的二元搜索:
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);
}
}
在构建时,我收到这个我不明白的错误。什么是()
类型?变量mid
始终为usize
,但即使使用as
广告,我也会收到此编译错误。
error: mismatched types [E0308]
mid as usize
^~~~~~~~~~~~
help: run `rustc --explain E0308` to see a detailed explanation
note: expected type `()`
note: found type `usize`
答案 0 :(得分:9)
()
是单位类型或单例类型:它有一个值,也表示为()
。
我个人将其视为具有0个元素的元组。
如果C或C ++使用void
(没有值)来表示函数的返回类型,它不会返回任何有趣的内容,Rust会使用()
代替。这对于元编程来说要好得多,因为()
是一个接受值,可以变异,借用等的常规类型......
关于您的特定代码示例:
if key == arr[mid] {
mid as usize
}
是()
类型的表达式(因为没有else
分支)但您尝试将if
块评估为mid as usize
,其类型为{ {1}}因此编译器会注意到不匹配。
您想在此使用usize
:
return
答案 1 :(得分:8)
()是单位类型,类似于其他语言的void
返回类型。
你在这里得到它:
if key == arr[mid] {
mid as usize
}
Rust希望if表达式返回()
,但是你为该表达式返回usize
。由于Rust中的几乎所有内容都是表达式,因此您可以通常隐式返回,就像您在这里尝试一样,但在这种特定情况下,您不能因为if
表达式不是while
表达式中的唯一表达式。您可以使用return mid as usize;
来解决当前问题。