我试图编写一个函数,将一个
上述函数无法正常工作,因为
如何克隆
以下是源迭代器的示例代码:
我该如何实现
Arc<[T]>
映射到一个 Iterable
中,以便与 flat_map
一起使用(也就是说,我想为某个其他的 i: Iterator<Item=Arc<[T]>>
调用 i.flat_map(my_iter)
)。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
,但是对其进行迭代的迭代器不应控制数据。) - Mario CarneiroVec::into_iter()
一样,否则引用更合适。 - Vladimir Matveev