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
有,所以我不知道如何构造这个子列。
答案 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,
}
strong
和weak
分别是此分配的强弱句柄数。 data
是分配的实际内容,以内联方式存储。而就是问题所在。
为了使您的代码能够按预期工作,Arc
不仅需要通过另一个指针引用data
(而不是将其存储为内联),而且还必须存储引用计数和不同位置的数据,以便您可以获取一部分数据,但保留相同的引用计数。
所以你不能做你所要求的。
您可以做的一件事而不是是将切片信息与一起存储在Arc
中。 owning_ref
包装箱有an example that does exactly this。