你怎么能轻易借用Vec <Vec <T >>作为&[&[T]]?

Oli*_*ier 7 rust

如何轻松地将矢量矢量作为一片切片借用?

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);
}
Run Code Online (Sandbox Code Playgroud)

我会收到以下错误:

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}>>`
Run Code Online (Sandbox Code Playgroud)

我可以很容易地定义use_slice_of_slices

fn use_slice_of_slices<T>(slice_of_slices: &[Vec<T>]) {
    // Do something
}
Run Code Online (Sandbox Code Playgroud)

并且外部向量将作为切片借用,并且所有都可以工作.但是,如果仅仅为了争论,我想把它作为一片切片借用呢?

从假设自动胁迫&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...
}
Run Code Online (Sandbox Code Playgroud)

把它用另一种方式,我怎么可能实现Borrow<[&[T]]>Vec<Vec<T>>

Mat*_* M. 10

不能.

根据定义,切片是现有元素集合的视图.它无法凭空捏造新元素或现有元素的新视图.

这源于Rust通用参数通常是不变量的事实.也就是说,虽然a &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);
}
Run Code Online (Sandbox Code Playgroud)

而不是强加元素的类型应该是什么,而是接受任何类型......但是放置一个必须是可强制的约束[T].

这几乎具有相同的效果,因为泛型函数只能[T]作为切片进行操作.作为奖励,它适用于多种类型(任何可以被强制转换为a [T]).