Generics Rust函数的向量返回类型错误 pub fn collect\u prime\u factors(编号:i32)->Vec{ 让mut prime_factors=Vec::new(); 因为我在2.号{ 如果编号%i==0{ 收集素数因子(数字/2); 素因子push(i); 素数因子 } } }

Generics Rust函数的向量返回类型错误 pub fn collect\u prime\u factors(编号:i32)->Vec{ 让mut prime_factors=Vec::new(); 因为我在2.号{ 如果编号%i==0{ 收集素数因子(数字/2); 素因子push(i); 素数因子 } } },generics,vector,return,rust,Generics,Vector,Return,Rust,错误: 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);

错误:

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错误:不匹配的类型:
期望`()`,
找到`集合::vec::vec`
(预期为(),
找到结构“collections::vec::vec`)[E0308]
lib.rs:14个基本要素
我不明白这里的问题。我将
Vec
声明为返回类型。为什么他们期待那些空括号

为什么只有在循环中使用它时,它才起作用?当我移除循环并且只返回素数因子时一切正常。

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

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


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

该函数的下一次迭代是
(2..number).filter(|&i | number%i==0).collect()
;仍然不产生主要因素;-)但是,为什么会有“无/空”元组的期望呢?是因为for循环不知道如何处理表达式的返回值吗?如果我使用“return”关键字…这是否是一个修复(无法编写atm代码)我发现了以下讨论:。基本上,我认为从循环返回一个值(特别是作为最终表达式)是有意义的,这一点并不明显。由于它目前是一个错误,如果/当达成一致意见时,它可能会被添加到Rust中。@xetra11,
for
作为一个表达式具有单位值
()
,就像几乎所有语句一样。因为循环是函数中的最后一条语句,所以编译器假定您从函数返回unit,同时声明函数必须返回
Vec
。这就是错误所在。当然,您不能直接从循环返回值,因为不清楚应该如何处理它<但是,code>return有效,因为它专门用于提前从函数返回值;但是,如果您使用它,您当然会发现循环过早结束。@xetra11确保对有用的答案进行投票,并接受最有助于您解决问题的答案。
collect\u prime\u factors(number/2)
?它计算出一个新的向量并把它扔掉。语义上是错误的,我是在rust告诉我这些新问题后才意识到的。请忽略
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
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
        }
    }
}
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.
}