https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=27451eb0a114417afcea5b6c53a92ff2

在此代码中:

fn main() {
    let my_vec = vec![1,2,3,4,5,6,7,8];
    let mut pair: Vec<Vec<u8>> = vec![vec![], vec![]];
    
    let mut my_vec_iter = my_vec.into_iter();
    // pair.iter_mut().for_each(|v| v.append(&mut my_vec_iter.take(4).collect()));
    // error[E0507]: cannot move out of `my_vec_iter`, a captured variable in an `FnMut` closure
    
    let my_ref = &mut my_vec_iter;
    pair.iter_mut().for_each(|v| v.append(&mut my_ref.take(4).collect()));
    
    println!("{:?}", pair);
}

被注释掉的行不能编译,因为(据我所知)take()获得了它的接收器的所有权,而您不能用捕获的变量来实现这一点.

但另一个版本,其中捕获的变量是&mut my_vec_iter,does可以用,我不明白发生了什么.我还找不到take(&mut self)的版本,所以它大概还在呼叫take(self)

像我5岁那样解释--为什么获取显式可变引用会阻止take获取所有权?或者,如果我误解了什么,到底是怎么回事?

推荐答案

这是可行的,因为Iterator也是为引用this impl实现的.

impl<I> Iterator for &mut I
where
    I: Iterator + ?Sized,

Iterator::take总是使用self,但您可以使用I&mut I作为self的类型.

Iterator上还有一个方便的方法,仅用于获取&mut self引用,因此您不需要进行另一个绑定,也不需要处理操作符优先级:Iterator::by_ref.

// these are identical

my_vec_iter.by_ref().take(4)

(&mut my_vec_iter).take(4)

从迭代器追加时也应使用extend.这避免了分配临时Vec.

pair.iter_mut().for_each(|v| v.extend(my_vec_iter.by_ref().take(4)));

Rust相关问答推荐

如何用Axum/Tower压缩Html内容?

如何向下转换到MyStruct并访问Arc Mutex MyStruct实现的方法?

在文件链实施中绕过borrow 判断器

什么是`&;[][..]`铁 rust 里的刻薄?

用于实现获取 struct 体 id 的特征规范

write_buffer 不写入缓冲区而是输出零 WGPU

.to_owned()、.clone() 和取消引用 (*) 之间有区别吗?

try 从标准输入获取用户名和密码并删除 \r\n

Rust 如何将链表推到前面?

OpenGL 如何同时渲染无纹理的四边形和有纹理的四边形

如何将 &[T] 或 Vec<T> 转换为 Arc<Mutex<[T]>>?

Rust中的位移操作对范围有什么影响?

一旦令牌作为文字使用,声明宏不匹配硬编码值?

在 Rust 中实现资源消耗的安全包装器

打印 `format_args!` 时borrow 时临时值丢失

Rust 中的通用 From 实现

如何构建包含本地依赖项的 docker 镜像?

如何制作具有关联类型的特征的类型擦除版本?

为什么 `ref` 会导致此示例*取消引用*一个字段?

为什么我返回的 impl Trait 的生命周期限制在其输入的生命周期内?