ベクトルのベクトルをスライスのスライスとして簡単に借用するにはどうすればよいでしょうか?
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>>
?
ベストアンサー1
あなたできない。
定義上、スライスとはビュー既存の要素の集合に基づいて行われます。新しい要素や、既存の要素の新しいビューを、何もないところから作り出すことはできません。
これは、Rustのジェネリックパラメータが一般的に不変量つまり、 a は&Vec<T>
として変換できますが&[T]
、T
これら 2 つの式の は一致する必要があります。
回避策としては、自分でジェネリック化することが考えられます。
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]
)で動作します。