作为学习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`
关于您的特定代码示例:
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
因为它正在返回到周围的上下文:在本例中,是调用函数的位置。
()是单元类型,类似于其他语言中的val
返回类型。
你在这里得到它:
if key == arr[mid] {
mid as usize
}
Rust期望if表达式返回()
,但您返回的是该表达式的usize。由于Rust中的几乎所有内容都是一个表达式,因此通常可以像这里尝试的那样隐式返回,但在这种特定情况下,您不能这样做,因为if表达式不是while表达式中的唯一表达式。您可以通过使用return mid as usize来解决眼前的问题
”。
是单位类型或单件类型:它有一个值,也表示为。
我个人认为它是一个包含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 我不知道这