由于类型[T; 10]
实现Rand
其中T: Rand
,因此可以直接使用rand::random()
:
extern crate rand;
fn main() {
let grid: [[bool; 10]; 10] = rand::random();
println!("{:#?}", grid);
}
至于你的例子中类型推断失败的原因,这里有一个稍微简单一点的例子来说明问题:
fn main() {
let mut arr = [false; 10];
let mapped = arr.iter_mut().map(|_| rand::random()).collect();
println!("{:?}", arr);
println!("{:?}", mapped);
}
给出了错误:
error[E0282]: unable to infer enough type information about `_`
--> src/main.rs:5:13
|
5 | let mapped = arr.iter_mut().map(|_| rand::random()).collect();
| ^^^^^^ cannot infer type for `_`
|
= note: type annotations or generic parameter binding required
因此,我们可以指定类型:
fn main() {
let mut arr = [false; 10];
let mapped = arr.iter_mut().map(|_| rand::random()).collect::<[bool; 10]>();
println!("{:?}", arr);
println!("{:?}", mapped);
}
注意在collect之后使用"turbofish"操作符::<>
来指定要收集到的类型,在本例中是::<[bool; 10]>
.不幸的是,在这里,编译器会抱怨:
error[E0277]: the trait bound `[_; 10]: std::iter::FromIterator<bool>` is not satisfied
那么std::iter::FromIterator<bool>
是多少?那么,考虑collect
个函数的定义:
fn collect<B>(self) -> B
where B: FromIterator<Self::Item>
这意味着你收集的任何类型都需要实现FromIterator<Self::Item>
.不幸的是,数组没有实现FromIterator
,但有许多可能的类型可以实现FromIterator
,例如Vec
、VecDeque
、HashSet
、BTreeSet
等等.因此,我们可以修改示例:
fn main() {
let mut arr = [false; 10];
let mapped = arr.iter_mut().map(|_| rand::random()).collect::<Vec<bool>>();
println!("{:?}", arr);
println!("{:?}", mapped);
}
然而,这可能不会给你带来你所希望的结果:
[false, false, false, false, false, false, false, false, false, false]
[true, false, false, true, true, false, true, false, true, true]
那又有什么好处呢?为什么尽管arr
被宣布为可变的,但它没有发生Mutations ,而我们使用的是iter_mut
?原因是map
在现有对象的基础上生成了一个new对象——它没有"就地"映射.如果您真的想就地绘制 map ,可以使用以下方法:
fn main() {
let mut arr = [false; 10];
let mapped = arr.iter_mut().map(|b| *b = rand::random()).collect::<Vec<()>>();
println!("{:?}", arr);
println!("{:?}", mapped);
}
顺从的
[true, false, true, true, true, false, false, false, true, true]
[(), (), (), (), (), (), (), (), (), ()]
然而,迭代器的这种使用被认为是单纯形的(更不用说令人困惑了)——惯用的方法是使用for
循环:
fn main() {
let mut arr = [false; 10];
for b in &mut arr {
*b = rand::random();
}
println!("{:?}", arr);
}
[false, true, true, true, false, false, true, false, true, false]
好多了.当然,在这个特殊的情况下,我的第一个例子可能是要走的路.