什么类型是" type()"在鲁斯特?

时间:2016-07-29 16:18:59

标签: rust

作为学习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`

2 个答案:

答案 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;来解决当前问题。