[英]How can I move elements out of a boxed slice, consuming the slice in the process?
[英]How can I copy a shared slice to have a boxed slice?
我有一个容器:
pub struct Foo<T> {
pub data: Box<[T]>,
}
我想要一种从现有切片初始化新的方法:
impl<T> Foo<T> {
fn from_slice(slice: &[T]) -> Foo<T> {
Foo {
data: Box::new(/* something here */),
}
}
}
我想从任何种类的切片中创建一个Foo
实例,这些切片来自动态矢量或静态字符串。
我想为什么会有vec!
是一个宏,但是有一种避免编写宏的方法吗? 我想我可以做slice.to_vec().into_boxed_slice()
,但是创建一个Vec
作为克隆的代理似乎不正确。
我没有在结构中使用Vec
,因为在容器的生存期内data
大小不应该改变。 使用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() }
}
}
如果您的数据是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() }
}
}
创建
Vec
作为克隆的代理似乎不正确
您不会在这里克隆。 克隆类型T
,您将得到类型T
您以&[T]
开头,并且想要一个Box<[T]>
,而不是[T]
(您不能拥有)。
通过Vec
创建盒装切片意味着您临时占用3个机器大小的整数,而不是2个; 与执行的分配数量相比,这不太可能是性能问题。
我确实同意starblue的回答 ,即在大多数情况下,保持Vec<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),*])
}
实际上,它只是为了方便语法而使用的宏(并且因为它使用了不稳定的box
关键字); 它接受参数,创建一个数组,将其装箱,将其Vec
转换为装箱的切片,然后将其转换为Vec
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.