【发布时间】:2021-04-14 03:50:56
【问题描述】:
为了实现一个结构体的迭代器,该结构体的切片具有生命周期,我必须这样做
struct S<'a, T> {
inner: &'a mut [T],
}
impl<'a, T> Iterator for S<'a, T> {
type Item = &'a mut T;
fn next(&mut self) -> Option<Self::Item> {
let temp = std::mem::take(&mut self.inner);
let (first, rest) = temp.split_first_mut()?;
self.inner = rest;
Some(first)
}
}
在编写此代码时,我意识到生命周期会强制执行额外的内存复制(mem::take),这在 C 或 C++ 中是不必要的。我是否在这里遗漏了什么,或者这是生锈付出一生的小代价?
【问题讨论】:
-
你想像什么类似的 C++ 代码不会复制
inner? (记住inner只是一个参考,而不是数据) -
@trentcl:
std::slice::IterMut避免创建临时对象,但它使用原始指针和不安全的操作来代替...@pandawithcat,为什么不让inner成为一个实例,然后委托给它? -
你为什么不使用某种...索引? play.rust-lang.org/…
标签: rust