繁体   English   中英

如何复制共享切片以具有盒装切片?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM