【问题标题】:Wrong vector return type for Rust functionRust 函数的向量返回类型错误
【发布时间】:2016-06-13 21:22:44
【问题描述】:
pub fn collect_prime_factors(number: i32) -> Vec<i32> {
    let mut prime_factors = Vec::new();

    for i in 2..number {
        if number % i == 0 {
            collect_prime_factors(number / 2);
            prime_factors.push(i);
            prime_factors
        }
    }
}

错误:

lib.rs:14:9: 14:22 error: mismatched types:
 expected `()`,
    found `collections::vec::Vec<i32>`
(expected (),
    found struct `collections::vec::Vec`) [E0308]
lib.rs:14         prime_factors

我不明白这里的问题。我将 Vec&lt;i32&gt; 声明为返回类型。为什么期待那些空括号?

为什么只有在循环中使用它时这不起作用?当我删除循环并且只有return prime_factors; 一切正常。

【问题讨论】:

  • 打电话给collect_prime_factors(number/2) 是为了什么?它计算一个新向量并将其丢弃。
  • 语义错误我只是在 rust 告诉我这些新问题后才意识到这一点。请忽略

标签: generics vector return rust


【解决方案1】:

有两个问题(除了粘贴错误)。

你引用的错误不是函数的返回值;这是if 表达式的值:

pub fn collect_prime_factors(number: i32) -> Vec<i32> {
    let mut prime_factors = Vec::new();

    for i in 2..number {
        if number % i == 0 {
            prime_factors.push(i);
            prime_factors   // This would be the value of the if
        }
    }
}

Rust 期望没有返回值,或者() 的值,但您返回的是prime_factors

如果你解决了这个问题,你会看到下一个错误是相反的,它期望函数返回一个Vec&lt;i32&gt;,但你返回的是()(什么都没有)。

我认为这里正确的做法是在收集完所有因素后在函数末尾返回向量:

pub fn collect_prime_factors(number: i32) -> Vec<i32> {
    let mut prime_factors = Vec::new();

    for i in 2..number {
        if number % i == 0 {
            prime_factors.push(i);
        };
    }
    prime_factors  // Return the vector from the function.
}

Playground link

(但这个函数实际上并不只返回素数!)

【讨论】:

  • 函数的下一次迭代将是(2..number).filter(|&amp;i| number % i == 0).collect();仍然没有产生主要因素;-)
  • 但是为什么期望什么都没有/空元组呢?是不是因为 for 循环不知道如何处理表达式的返回值?如果我会使用'return'关键字......那会是一个修复(无法编写代码atm)
  • 我发现了这个讨论:github.com/rust-lang/rfcs/issues/961。基本上我认为归结为从循环中返回一个值(尤其是作为最终表达式)并不明显是有意义的。由于它目前是一个错误,如果/当有协议时,它可以在将来添加到 Rust。
  • @xetra11, for 作为表达式具有单位值(),就像几乎所有语句一样。因为循环是函数中的最后一条语句,所以编译器假定您从函数返回 unit,同时声明函数必须返回 Vec&lt;i32&gt;。这就是错误所在。自然,您不能直接从循环中返回值,因为不清楚应该如何处理它。但是,return 有效,因为它专门用于尽早从函数返回值;但是,如果你使用它,你当然会发现你的循环提前结束了。
  • @xetra11 确保对有用的答案投赞成票,并接受最能帮助您解决问题的答案。
猜你喜欢
  • 1970-01-01
  • 2019-12-12
  • 2021-02-01
  • 2015-11-17
  • 1970-01-01
  • 2017-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多