gpt4 book ai didi

rust - 如何轻松借用 Vec> 作为 &[&[T]]?

转载 作者:行者123 更新时间:2023-11-29 07:46:18 25 4
gpt4 key购买 nike

如何轻松借用向量的向量作为切片的切片?

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>>

最佳答案

不能

根据定义,切片是对现有元素集合的 View 。它不能凭空变出新元素或对现有元素的新观点。

这源于 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] 的类型)。

关于rust - 如何轻松借用 Vec<Vec<T>> 作为 &[&[T]]?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50056778/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com