rust - 为什么删除返回给我一个错误 : expected type `()` but found type

标签 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`

truefalse 替换为 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/

相关文章:

rust - 在等待时杀死子进程

rust - 如何在 Rust 中编写管道过滤器?

vector - 如何创建堆栈分配的类似矢量的容器?

rust - 如何建立一个可变的Vecs池,以便在Drop上重复使用?

rust - Rust 签名中的 'a 用于什么?

debugging - 有dbg吗! Rust 中的替代方案,它不会将元组分成这么多行?

rust - 嵌套闭包借用失败

rust - 返回 Future 类型时无法推断类型 F

reference - 包含可变切片的结构

rust - 如何使用 Serde 反序列化带有读者引用的结构?