我正在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;
有效,但为什么使用之前的不编译?
答案 0 :(得分:14)
Rust是面向表达的。在任何块中,其中的最后一个表达式是块的值。因此,对于函数,块中的最后一个值被视为返回值。
在其他块中,情况并非如此 - 毕竟,最后一个值被视为块的值,而不是函数的返回值。
为了清晰起见,只需添加一些代码片段即可:
let has_factor = if number % i == 0 && i != number {
false
}
这意味着如果子句为真,则if
语句的结果为false
,然后将该值适当地插入到has_factor
变量中。如果该子句 not 为true,则将评估else
子句。鉴于没有else子句,就好像编写了else { }
,这相当于else { () }
。此else块的计算结果为单位类型()
。现在我们有一个不匹配:if
块(因此has_factor
变量)类型bool
,if
块需要,或()
,因为[缺少] else块需要?这是错误的来源。
摘要:您不能只省略return
关键字,因为这不是表达方向的含义。在函数的末尾,它们归结为相同的东西,而sans - return
形式应该是首选,但在其他位置它们不等同,return
必须明确。
最终代码:
fn is_prime(number: i64) -> bool {
for i in 2..number {
if number % i == 0 && i != number {
return false;
}
}
true
}