Lambda 用锈迹书写的替代功能样式

Lambda 用锈迹书写的替代功能样式,lambda,functional-programming,rust,Lambda,Functional Programming,Rust,如何更正第2节中的语法错误?显示了一条错误消息 error[E0277]切片索引的类型为'usize'或范围为'usize'` 当第2节被编译时。(第1节和第2节;它们在不同的编程风格中具有相同的功能。) extern板条箱兰德; 使用std::iter; 使用rand::Rng; fn估计面积CircleMontecarlo(){ 设箱面积=4.0; 数量=100000; 设mut x=Vec:::具有_容量(numIteration); 设mut y=Vec:::具有_容量(numIter

如何更正第2节中的语法错误?显示了一条错误消息

error[E0277]切片索引的类型为'usize'或范围为'usize'`
当第2节被编译时。(第1节和第2节;它们在不同的编程风格中具有相同的功能。)

extern板条箱兰德;
使用std::iter;
使用rand::Rng;
fn估计面积CircleMontecarlo(){
设箱面积=4.0;
数量=100000;
设mut x=Vec:::具有_容量(numIteration);
设mut y=Vec:::具有_容量(numIteration);
设mut distance=Vec:::具有_容量(numIteration);
让mut rng=rand::thread_rng();
x=iter::重复(())
.map(|()| rng.gen_范围(-1,1.))
.采取(限制措施)
收集::();
y=iter::重复(())
.map(|()| rng.gen_范围(-1,1.))
.采取(限制措施)
收集::();
//第1节,它是可以编译的。
距离=(0..numIteration)
.map(|i |(x[i].powi(2)+y[i].powi(2)).sqrt())
收集::();
//第2节,功能与第1节相同,但无法编译。
//错误[E0277]^^^^切片索引的类型为'usize'或范围为'usize'`
/*
距离=iter::重复(())
.map(|i |(x[i].powi(2)+y[i].powi(2)).sqrt())
.采取(限制措施)
收集::();
*/
println!(“x={}”,x[numIteration-1]);
println!(“y={}”,y[numIteration-1]);
println!(“距离={}”,距离[numIteration-1]);
}
iter::repeat(())
创建一个迭代器,生成
()
(单元类型)。然后使用此闭包映射这些迭代项:

|i| (x[i].powi(2) + y[i].powi(2)).sqrt()
因此,
i
属于
()
类型。您不能像编译器所说的那样,使用
()
索引某些内容:

“(”未实现特性“std::slice::SliceIndex”。
`
解决此问题的一种方法是列举:

distance = iter::repeat(()).enumerate()
    .map(|(i, _)| (x[i].powi(2) + y[i].powi(2)).sqrt())
    .take(numIteration)
    .collect();
但是您的第一个解决方案更好,因为
iter::repeat
的东西是无用的


请注意,如果不需要保留
x
s和
y
s,则需要进行一些不必要的分配。此代码可以简单地编写为:

extern crate rand;

use rand::Rng;

fn estimate_area_circle_monteCarlo() {
    let num_iteration = 100000;
    let mut rng = rand::thread_rng();

    let distances: Vec<_> = (0..num_iteration)
        .map(|_| {
            let x: f32 = rng.gen_range(-1., 1.);
            let y: f32 = rng.gen_range(-1., 1.);
            (x.powi(2) + y.powi(2)).sqrt()
        })
        .collect();

    println!("last distance = {}", distances.last().unwrap());
}
extern板条箱兰德;
使用rand::Rng;
fn估算面积、圆、蒙特卡罗(){
设num_迭代=100000;
让mut rng=rand::thread_rng();
let距离:Vec=(0..num_迭代)
.地图{
设x:f32=rng.gen_范围(-1,1.);
设y:f32=rng.gen_范围(-1,1.);
(x.powi(2)+y.powi(2)).sqrt()
})
.收集();
println!(“最后距离={}”,distance.last().unwrap());
}

仅当您实际需要
Vec
HashSet
或任何东西时,才使用
collect
。如果您的目的是迭代某些数据,请保持迭代器不变。

有一个最终版本供参考

distance = iter::repeat(())
        .enumerate()
        .map(|(i, _)| (x[i].powi(2) + y[i].powi(2)).sqrt())
        .take(numIteration)
        .collect::<Vec<f64>>();
distance=iter::repeat(())
.enumerate()
.map(|(i,|)(x[i].powi(2)+y[i].powi(2)).sqrt())
.采取(限制措施)
收集::();

谢谢您的帮助。显示了一条错误消息“^expected struct
std::vec::vec
,found struct`std::iter::Map”。通过以下修改“distance=iter::repeat(()).enumerate().map(|(i,|)(x[i].powi(2)+y[i].powi(2)).sqrt()).take(numIteration).collect::()”@madeinquint我没有写完整的代码。。。只有有问题的部分。@MadeInquint我也写了
collect
,如果你愿意的话。
distance = iter::repeat(())
        .enumerate()
        .map(|(i, _)| (x[i].powi(2) + y[i].powi(2)).sqrt())
        .take(numIteration)
        .collect::<Vec<f64>>();