我有一个容器:
pub struct Foo<T> {
pub data: Box<[T]>,
}
Run Code Online (Sandbox Code Playgroud)
我想要一种从现有切片初始化新切片的方法:
impl<T> Foo<T> {
fn from_slice(slice: &[T]) -> Foo<T> {
Foo {
data: Box::new(/* something here */),
}
}
}
Run Code Online (Sandbox Code Playgroud)
我想Foo从任何类型的切片(来自动态向量或静态字符串)创建一个实例。
我想宏是有原因的vec!,但是有没有办法避免编写宏呢?我想我可以这样做,但创建一个作为克隆的代理slice.to_vec().into_boxed_slice()似乎并不正确......Vec
我没有Vec在我的结构中使用 a ,因为data在容器的生命周期内它的大小不应该改变。使用 a 感觉不对,Vec但我可能是错的。
如果你的切片包含Copy类型,你可以使用From/Into来执行构造:
pub struct Foo<T> {
pub data: Box<[T]>,
}
impl<T> Foo<T> {
fn from_slice(slice: &[T]) -> Foo<T>
where
T: Copy,
{
Foo { data: slice.into() }
}
}
Run Code Online (Sandbox Code Playgroud)
如果您的数据是Clone,那么您可以使用to_vec+ into_boxed_slice:
impl<T> Foo<T> {
fn from_slice(slice: &[T]) -> Foo<T>
where
T: Clone,
{
Foo { data: slice.to_vec().into_boxed_slice() }
}
}
Run Code Online (Sandbox Code Playgroud)
创建
Vec作为克隆的代理似乎不正确
你不是在这里克隆。当你克隆一个类型时T,你会得到一个类型T。你从 a 开始&[T],想要得到 a Box<[T]>,而不是 a [T](你不能拥有)。
通过a创建装箱切片Vec意味着你暂时占用3个机器大小的整数而不是2个;与执行的分配量相比,这不太可能是性能问题。
我确实同意星蓝的答案,即在大多数情况下保留 aVec<T>可能更简单,但我承认有时有一个盒装切片很有用。
也可以看看:
vec!我想宏是有原因的
的实施vec!是公开的:
macro_rules! vec {
($elem:expr; $n:expr) => (
$crate::vec::from_elem($elem, $n)
);
($($x:expr),*) => (
<[_]>::into_vec(box [$($x),*])
);
($($x:expr,)*) => (vec![$($x),*])
}
Run Code Online (Sandbox Code Playgroud)
它实际上只是一个为了语法方便而使用的宏(并且因为它使用了unstablebox关键字);它接受参数,创建一个数组,将其装箱,将其强制为装箱切片,然后将其转换为Vec.
| 归档时间: |
|
| 查看次数: |
1583 次 |
| 最近记录: |