返回借我试图写一个Arc<[T]>
映射到一个Iterable
,对于flat_map
使用的功能(即,我想打电话给i.flat_map(my_iter)
其他一些i: Iterator<Item=Arc<[T]>>
)。从拥有资源
fn my_iter<'a, T>(n: Arc<[T]>) -> slice::Iter<'a, T> {
let t: &'a [T] = &*n.clone();
t.into_iter()
}
功能上面不起作用,因为n.clone()
产生Arc<[T]>
型的资价值,我可以取消引用到[T]
再借用得到&[T]
,但借的生命周期只持续,直到函数结束,而'a
生命周期会持续到客户端丢弃返回的迭代器。
如何克隆Arc
以便客户端获得克隆的所有权,以便只在客户端完成迭代器(假设没有其他人正在使用Arc
)后才会删除该值?
下面是源迭代一些示例代码:
struct BaseIter<T>(Arc<[T]>);
impl<T> Iterator for BaseIter<T> {
type Item = Arc<[T]>;
fn next(&mut self) -> Option<Self::Item> {
Some(self.0.clone())
}
}
如何实现的BaseIter(data).flat_map(my_iter)
的结果(这是类型Iterator<&T>
的)鉴于BaseIter
是生产数据,不只是借用它? (真实情况比这更复杂,并不总是相同的结果,但所有权语义是相同的。)
感谢这个启发性的写作,这帮助我解决了这个问题。在这种情况下,我意识到我过度使用'Arc';迭代器不应该使用'Arc',因为它们不拥有数据的所有权 - 客户端已经拥有'data'字段,迭代器应该从中借用。 (我的数据结构是一种具有共享子项的二叉树,所以我认为'Arc'仍然适用于数据结构中的子链接,但是迭代器不应该控制数据。) –
@MarioCarneiro,yep ,你的总结是正确的。只有当原始结构被消耗时,迭代器才拥有它们之后产生的数据的所有权,就像使用'Vec :: into_iter()'一样,否则引用更合适。 –