我在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`
用return true;
/return false;
代替true
和false
工作,但为什么使用以前的不编译?
Rust是面向表达式的。在任何块中,其中的最后一个表达式是块的值。因此,对于函数,块中的最后一个值被视为返回值。
但是在其他代码块中,情况并非如此——毕竟,最后一个值被视为代码块的值,而不是函数的返回值。
为了清晰起见,只添加了一点代码片段:
let has_factor = if number % i == 0 && i != number {
false
}
这意味着如果子句为真,整个if
语句的结果是false
,然后将该值适当地插入到has_factor
变量中。如果子句不是 true,则计算else
子句。如果没有else子句,就好像已经写了else { }
,相当于else { () }
。这个else块的计算结果为()
,即单元类型。现在我们有一个不匹配:if
块(因此has_factor
变量)是bool
类型的,如if
块所要求的,还是()
类型的,如[缺乏]else块所要求的?这就是错误的来源。
Summary:你不能省略return
关键字,因为那不是表达式方向的意思。在函数的末尾,它们归结为相同的东西,sans- return
形式应该是首选,但在其他位置它们不相等,return
必须显式。
fn is_prime(number: i64) -> bool {
for i in 2..number {
if number % i == 0 && i != number {
return false;
}
}
true
}