当前位置: 首页 > 知识库问答 >
问题:

Rust中的“type()”是什么类型?

江德润
2023-03-14

作为学习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,但即使使用cast,我也会遇到这个编译错误。

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

共有3个答案

曾高杰
2023-03-14
  1. 返回类型

关于您的特定代码示例:

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

通过在此表达式末尾省略分号,您将尝试返回类型()

“为什么?”你可能会问。请看这个答案,但长话短说,它通过避免if语句中的类型使核心语言更简单。

24 | |         };
   | |_________^ expected `()`, found integer
   |
   = note: `if` expressions without `else` evaluate to `()`
   = help: consider adding an `else` block that evaluates to the expected type

For more information about this error, try `rustc --explain E0317`.

即使在这里添加ore语句也无济于事,因为您要做的是提前从函数返回,而不是返回表达式的值。请记住,任何非分号结尾的表达式{表达式}都将其值返回给周围的上下文,在这种情况下,该上下文是函数的主体。

使用return会导致函数提前返回,这正是您想要的。

if key == arr[mid] {
    return mid as usize;
}

请注意,函数末尾不需要return函数的原因

-1 as usize

因为它正在返回到周围的上下文:在本例中,是调用函数的位置。

龙智
2023-03-14

()是单元类型,类似于其他语言中的val返回类型。

你在这里得到它:

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

Rust期望if表达式返回(),但您返回的是该表达式的usize。由于Rust中的几乎所有内容都是一个表达式,因此通常可以像这里尝试的那样隐式返回,但在这种特定情况下,您不能这样做,因为if表达式不是while表达式中的唯一表达式。您可以通过使用return mid as usize来解决眼前的问题 ”。

丁宏浚
2023-03-14

是单位类型或单件类型:它有一个值,也表示为。

我个人认为它是一个包含0个元素的元组。

如果C或C将使用void(没有值)来指示函数的返回类型,而该函数没有返回任何有趣的内容,则Rust将使用void(没有值)。这对元编程更好,因为它是一种常规类型,可以接受值,可以进行变异、借用等。。。

关于您的特定代码示例

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

()类型的表达式(因为没有其他分支),但您正在尝试将if块评估为中作为usize,其类型为usize,因此编译器会注意到不匹配。

您想在此处使用返回:

if key == arr[mid] {
    return mid as usize;
}
 类似资料:
  • 我掌握了Fn(大写字母F)特征:,,。我明白它们是特征,并且像特征一样工作。 但是(lowercase-f)呢?它在编辑器中得到了不同的颜色,这告诉我它不是一个特性。它也可以在其他地方不能使用的地方使用(反之亦然),尽管它在其他情况下似乎表现相似。我在文档中找不到任何直接解释它的东西。

  • 问题内容: 这段代码在: 最后一行使我感到非常困惑。我不知道的意思。 这些是其他代码: 结果是 我猜想的功能是从中选择所有元素,但是我还没有找到正式的解释。它是什么? 问题答案: builtin.go中的代码用作文档。该代码未编译。 在指出这个函数的最后一个参数是可变参数。可变参数在Go语言规范中进行了说明。 该类型的部分为任何围棋类型替身。

  • 我希望这能奏效: ...但它没有: 游戏Geofence:http://is.gd/kxDt0P 那么,发生了什么事? 我不知道这个错误是什么意思。 是因为我使用的是Result,而这要求U,V不是大小的吗?在这种情况下,它们的尺寸为何?我没有写: 所有泛型现在都是动态调整大小还是什么?(在这种情况下,大小是什么?甚至是什么意思?) 怎么回事啊?

  • 问题内容: javascript 的MIME类型是什么? 更具体地说,在脚本标签的“type”属性中放置什么是正确的?并且似乎是主要竞争者。 问题答案: 这是一个常见的错误。javascript的MIME类型多年未标准化。现在正式是:“ application / javascript ”。 真正的缺点是,大多数浏览器无论如何都不会使用该属性,至少在script标签的情况下不会。他们实际上偷窥了包

  • 问题内容: 我正在使用OWASP ZAP在我的本地主机上进行一些渗透测试,并且不断报告此消息: Anti-MIME-Sniffing标头X-Content-Type-Options未设置为’nosniff’ 此检查特定于Internet Explorer 8和Google Chrome。如果Content- Type标头未知,请确保每个页面都设置了Content-Type标头和X-CONTENT-

  • 我正在用OWASP ZAP在我的本地主机上做一些渗透测试,它不断报告这样的消息: 反MIME-嗅探标头X-Content-Type-Options未设置为“nosniff” 此检查针对Internet Explorer 8和Google Chrome。确保每个页面都设置一个Content-Type头,如果Content-Type头未知,则设置X-CONTENT-TYPE-OPTIONS 我不知道这