【问题标题】:Why does removing return give me an error: expected type `()` but found type为什么删除返回给我一个错误:预期类型`()`但找到类型
【发布时间】:2018-12-05 02:52:34
【问题描述】:

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

【问题讨论】:

  • 顺便说一句,i != number 检查毫无意义,因为range 不包括第二个端点(即它的行为类似于 Python)。此外,函数可以写成` fn is_prime(number: i64) -> bool { !range(2, number).any(|i| number % i == 0) }`。
  • @dbaupp:我会写fn is_prime(number: i64) -> bool { range(2, number).all(|i| number % i != 0) }
  • @ChrisMorgan 你说“不是”,我说“不是任何”,德摩根说“谁在乎”:P(另外,奇怪的是我的原始代码不是代码格式:fn is_prime(number: i64) -> bool { !range(2, number).any(|i| number % i == 0) } .)
  • @dbaupp 是的,但我是这里唯一的摩根。 ??????

标签: rust


【解决方案1】:

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

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

为了清楚起见,单独添加一些 sn-p:

let has_factor = if number % i == 0 && i != number {
    false
}

这意味着如果子句为真,则整个if 语句的结果是false,然后将该值适当地插入has_factor 变量中。如果子句 not true,则将评估 else 子句。鉴于没有 else 子句,就好像写了else { },相当于else { () }。这个 else 块的计算结果为 (),即单位类型。现在我们有一个不匹配:是bool 类型的if 块(因此是has_factor 变量),因为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
}

【讨论】:

  • 另外,请注意 for/while/loop 表达式的值始终是 ()
猜你喜欢
  • 1970-01-01
  • 2021-01-17
  • 2013-03-06
  • 1970-01-01
  • 2022-01-14
  • 1970-01-01
  • 2016-04-15
  • 2011-12-27
  • 1970-01-01
相关资源
最近更新 更多