如何轻松地将矢量矢量作为一片切片借用?
fn use_slice_of_slices<T>(slice_of_slices: &[&[T]]) {
// Do something...
}
fn main() {
let vec_of_vec = vec![vec![0]; 10];
use_slice_of_slices(&vec_of_vec);
}
我会收到以下错误:
error[E0308]: mismatched types
--> src/main.rs:7:25
|
7 | use_slice_of_slices(&vec_of_vec);
| ^^^^^^^^^^^ expected slice, found struct `std::vec::Vec`
|
= note: expected type `&[&[_]]`
found type `&std::vec::Vec<std::vec::Vec<{integer}>>`
我可以轻松地将use_slice_of_slices
定义为
fn use_slice_of_slices<T>(slice_of_slices: &[Vec<T>]) {
// Do something
}
并且外部向量将作为切片借用,并且所有都可以工作。但是,如果仅仅为了争论,我想把它作为一片切片借用呢?
假设无法从&Vec<Vec<T>>
自动强制转换为&[&[T]]
,那么如何定义函数borrow_vec_of_vec
如下所示?
fn borrow_vec_of_vec<'a, T: 'a>(vec_of_vec: Vec<Vec<T>>) -> &'a [&'a [T]] {
// Borrow vec_of_vec...
}
换句话说,我如何为Borrow<[&[T]]>
实施Vec<Vec<T>>
?
答案 0 :(得分:10)
你不能。
根据定义,切片是现有元素集合上的视图。它无法凭空想象出新的元素或现有元素的新观点。
这源于Rust通用参数通常为不变量的事实。也就是说,虽然&Vec<T>
可以在时尚之后转换为&[T]
,但这两个表达式中的T
必须匹配。
可能的解决方法是自己通用。
use std::fmt::Debug;
fn use_slice_of_slices<U, T>(slice_of_slices: &[U])
where
U: AsRef<[T]>,
T: Debug,
{
for slice in slice_of_slices {
println!("{:?}", slice.as_ref());
}
}
fn main() {
let vec_of_vec = vec![vec![0]; 10];
use_slice_of_slices(&vec_of_vec);
}
不是强加元素的类型,而是接受任何类型......但是放置一个必须对[T]
具有强制性的约束。
这几乎具有相同的效果,因为泛型函数只能将[T]
作为切片进行操作。作为奖励,它适用于多种类型(任何可以强制转换为[T]
)。