我在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`.
有人可以帮我理解我做错了吗?
答案 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);