如何制作Vec包含[0,1,2,3,4,3,2,1,0]使用范围?我试过这个:
let mut a = vec![0..len];
let b = vec![len..=0];
a.extend(&b);
Run Code Online (Sandbox Code Playgroud)
但它会引发一个错误:
let mut a = vec![0..len];
let b = vec![len..=0];
a.extend(&b);
Run Code Online (Sandbox Code Playgroud)
据我所知,没有直接的语法可以Vec直接从范围创建。范围是一流的对象并实现Iterator,因此您可以将collect范围转换为Vec。
范围也必须是从低到高。要获得反向范围,请创建常规正向范围并调用rev以创建反向迭代的迭代器。
let mut a = (0..len).collect::<Vec<_>>();
let b = (0..=len).rev();
a.extend(&b);
Run Code Online (Sandbox Code Playgroud)
您会注意到这collect需要::<>所谓的涡轮鱼操作员。这是因为它是一个泛型方法,可以将迭代器转换为任何实现FromIterator. 有许多实现的集合类型FromIterator,因此我们必须告诉它我们想要一个Vec特定的。
声明a的类型也有效:
let mut a: Vec<_> = (0..len).collect();
let b = (0..=len).rev();
a.extend(&b);
Run Code Online (Sandbox Code Playgroud)
还可以通过将两个迭代器链接在一起然后收集结果来构造向量。这种方式a不需要mut。
let a = (0..len).chain((0..=len).rev())
.collect::<Vec<_>>();
Run Code Online (Sandbox Code Playgroud)