我正在用 Rust 编写一个 is_prime
函数,我的印象是简单地编写 true
就等同于 return true;
,但在我的函数中并非如此:
fn is_prime(number: i64) -> bool {
for i in 2i64..number {
if number % i == 0 && i != number {
false
}
}
true
}
这会给我错误:
error[E0308]: mismatched types
--> src/lib.rs:4:13
|
4 | false
| ^^^^^ expected (), found bool
|
= note: expected type `()`
found type `bool`
将 true
和 false
替换为 return true;
/return false;
有效,但为什么使用以前的不编译?
最佳答案
Rust 是面向表达式的。在任何 block 中,它里面的最后一个表达式就是 block 的值。因此,对于函数, block 中的最后一个值被视为返回值。
但在其他 block 中,情况并非如此——毕竟,最后一个值被视为 block 的值,而不是函数的返回值。
为了清晰起见,只添加了一点孤立的片段:
let has_factor = if number % i == 0 && i != number {
false
}
这意味着如果子句为真,则整个 if
语句的结果为 false
,然后将该值适本地插入到 has_factor 中
变量。如果该子句不 为真,则将评估else
子句。鉴于没有else子句,就好像写了else{}
,相当于else{()}
。此 else block 的计算结果为单元类型 ()
。现在我们有一个不匹配:是 bool
类型的 if
block (以及因此 has_factor
变量),作为 if
block 需要,或 ()
,因为 [缺少] else block 需要?这就是错误的来源。
总结:您不能只省略 return
关键字,因为这不是表达式方向的含义。在 function 的末尾,它们归结为同一件事,应该首选 sans-return
形式,但在其他位置它们并不等同, return
必须是显式的。
最终代码:
fn is_prime(number: i64) -> bool {
for i in 2..number {
if number % i == 0 && i != number {
return false;
}
}
true
}
关于rust - 为什么删除返回给我一个错误 : expected type `()` but found type,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24502282/