为什么这个错误出现“无法推断出关于`_`的足够类型信息”

时间:2016-01-12 03:54:58

标签: rust rust-cargo

我在Rust中有一些简单的代码:

 let d = [2, 3, 4, 6, 8];
 for x in d.iter()
            .take(5) 
            .product() {                                                                            
                println!("{} is the product !", x)                                                                                                                                             
            } 

当我运行此代码时,我收到错误:

src/functional.rs:63:9: 67:14 error: unable to infer enough type information about `_`; type annotations or generic parameter binding required [E0282]
src/functional.rs:63         for x in d.iter()
src/functional.rs:64             .take(5)
src/functional.rs:65             .product() {
src/functional.rs:66                 println!("{} is the product !", x)
src/functional.rs:67             }
src/functional.rs:63:9: 67:14 help: run `rustc --explain E0282` to see a detailed explanation
error: aborting due to previous error
Could not compile `gettingrusty`.

有人可以帮我理解我做错了吗?

2 个答案:

答案 0 :(得分:3)

product方法(从Rust 1.5开始不稳定)从迭代器生成单个值;它不会产生另一个迭代器。因此,在for循环中使用它是没有意义的。

但是,即使使用以下代码,我们仍然会收到相同的错误:

#![feature(iter_arith)]

fn main() {
    let d = [2, 3, 4, 6, 8];
    let v = d.iter().take(5).product();
    println!("{}", v);
}

错误来自编译器无法确定product的结果类型。我不确定为什么;它可能是编译器中的一个错误,或者可能只是它的含糊不清。在数组中的一个文字上添加类型后缀(例如,将2更改为2i32)并不能解决这个问题,并指定d的类型(例如{{} 1}}}也没有帮助。这意味着我们需要告诉编译器我们期望从[i32; 5]获得什么类型。

product

答案 1 :(得分:3)

除了Francis'回答,使用feature属性需要每晚构建一次Rust(也就是说,你可能下载的稳定版本赢了,并且让你运行他的解决方案)。

另一方面......你可以自己动手做这样的事情:

let d = [2, 3, 4, 6, 8];
let x = d.iter()
        .take(5)
        .fold(1, |a, b| a * b);

println!("{} is the product !", x);

哪个will run happily on the stable release