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

Syn*_*ose 8 rust

is_prime在Rust中编写了一个函数,我的印象是简单的写作true相当于return true;,但在我的函数中并非如此:

fn is_prime(number: i64) -> bool {
    for i in 2i64..number {
        if number % i == 0 && i != number {
            false
        }
    }
    true
}
Run Code Online (Sandbox Code Playgroud)

这会给我错误:

error[E0308]: mismatched types
 --> src/lib.rs:4:13
  |
4 |             false
  |             ^^^^^ expected (), found bool
  |
  = note: expected type `()`
             found type `bool`
Run Code Online (Sandbox Code Playgroud)

替换truefalse使用return true;/ return false;工作,但为什么使用以前不编译?

Chr*_*gan 17

Rust是面向表达的.在任何块中,其中的最后一个表达式是块的值.因此,对于函数,块中的最后一个值被视为返回值.

但是,在其他块中,情况并非如此 - 毕竟,最后一个值被视为块的值,而不是函数的返回值.

为了清晰起见,只需添加一些代码片段:

let has_factor = if number % i == 0 && i != number {
    false
}
Run Code Online (Sandbox Code Playgroud)

这意味着if整个语句的结果是false该子句是否为真,然后该值适当地插入到has_factor变量中.如果该子句不为真,则将对该else子句进行评估.鉴于没有else子句,就好像else { }已经写好了,相当于else { () }.此else块计算()单位类型.现在我们有一个不匹配:类型的if块(因而是has_factor变量)bool,如if块所需,或者(),[缺少] else块需要?这是错误的来源.

简介:您不能只省略return关键字,因为这不是表达方向的含义.在函数结束时,它们归结为相同的东西,并且sans- returnform应该是首选,但在其他位置它们不是等价的并且return必须是明确的.

最终代码:

fn is_prime(number: i64) -> bool {
    for i in 2..number {
        if number % i == 0 && i != number {
            return false;
        }
    }
    true
}
Run Code Online (Sandbox Code Playgroud)