如何取一个弧的子切片< [T]>

时间:2016-03-27 08:03:06

标签: rust

fn subslice(a: Arc<[T]>, begin: usize, end: usize) -> Arc<[T]> {
    Arc::new(a[begin..end])
}

以上&#34;明显的实施&#34; Arc<[T]>的子操作操作不起作用,因为a[begin..end]的类型为[T],这是未分级的。 Arc<T>有一个奇怪的属性,类型本身不需要T: Sized,但构造函数Arc::new有,所以我不知道如何构造这个子列。

1 个答案:

答案 0 :(得分:2)

你不能。

为了解释原因,让我们看一下Arc实际上是什么。

pub struct Arc<T: ?Sized> {
    ptr: Shared<ArcInner<T>>,
}

Shared<T>是一个内部包装类型,基本上等于“*const T,但不能为零”;所以它基本上是&T没有生命。这意味着您无法在此级别调整切片;如果你这样做了,你最终会试图指向一个不存在的ArcInner。因此,如果可能,则必须对ArcInner进行一些操作。

ArcInner<T>定义如下:

struct ArcInner<T: ?Sized> {
    strong: atomic::AtomicUsize,
    weak: atomic::AtomicUsize,
    data: T,
}

strongweak分别是此分配的强弱句柄数。 data是分配的实际内容,以内联方式存储。而就是问题所在。

为了使您的代码能够按预期工作,Arc不仅需要通过另一个指针引用data(而不是将其存储为内联),而且还必须存储引用计数和不同位置的数据,以便您可以获取一部分数据,但保留相同的引用计数。

所以你不能做你所要求的。

您可以做的一件事而不是是将切片信息一起存储在Arc中。 owning_ref包装箱有an example that does exactly this