为什么删除返回给我一个错误:期望类型`()`但找到类型

时间:2014-07-01 04:04:10

标签: rust

我正在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;有效,但为什么使用之前的不编译?

1 个答案:

答案 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变量)类型boolif块需要,或() ,因为[缺少] 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
}