gpt4 book ai didi

rust - 如何复制共享切片以拥有盒装切片?

转载 作者:行者123 更新时间:2023-11-29 08:12:01 25 4
gpt4 key购买 nike

我有一个容器:

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() }
}
}

it doesn't seem right to create a Vec as a proxy to a clone

不是在这里克隆。当您克隆类型时 T ,你得到一个类型 T后退。您从 &[T] 开始想得到一个Box<[T]> , 不是 [T] (你不能拥有)。

通过 Vec 创建盒装切片表示你暂时占用3个机器大小的整数,而不是2个;与执行的分配量相比,这不太可能成为性能问题。

我同意 starblue's answer保持 Vec<T>在大多数情况下可能更简单,但我承认有时使用盒装切片很有用。

另见:

I suppose there is a reason why vec! is a macro

implementation of 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。 .

关于rust - 如何复制共享切片以拥有盒装切片?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56372993/

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