iter::repeat(())
создает итератор, который выдает ()
(тип единицы).Затем вы отображаете эти повторяющиеся элементы с этим замыканием:
|i| (x[i].powi(2) + y[i].powi(2)).sqrt()
i
, таким образом, имеет тип ()
.Вы не можете индексировать что-то с помощью ()
, как сказано компилятором:
the trait `std::slice::SliceIndex<[f64]>` is not implemented for `()`
Один из способов решить эту проблему может быть перечислением:
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());
}
Используйте collect
, только если вы действительно хотите Vec
, HashSet
или что-то еще.Если ваша цель состоит в том, чтобы перебрать некоторые данные, оставьте итератор без изменений.