提问人:Chowlett 提问时间:10/1/2023 更新时间:10/1/2023 访问量:68
为什么 (&mut iter).take(n) 不获取 iter 的所有权?[复制]
Why doesn't (&mut iter).take(n) take ownership of iter? [duplicate]
问:
在此代码中:
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
take(&mut self)
take(self)
像我 5 岁一样解释 - 为什么采用显式可变引用会停止拥有所有权?或者,如果我误解了什么,那是怎么回事?take
答:
2赞
drewtato
10/1/2023
#1
这之所以有效,是因为也可以为具有此 impl 的引用实现。Iterator
impl<I> Iterator for &mut I
where
I: Iterator + ?Sized,
Iterator::take
总是取 ,但您可以使用 or 作为 的类型。self
I
&mut I
self
还有一个方便的方法,只是为了获取一个引用,所以你不需要做另一个绑定或与运算符优先级竞争:Iterator::by_ref
。Iterator
&mut self
// 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)));
评论
0赞
Chowlett
10/2/2023
等一下,等等。在我的代码的 mut-ref 版本中,大概仍然被闭包捕获,并且仍然会获得所有权(只是不是底层)。为什么允许这样做?my_ref
take
my_ref
my_vec_iter
0赞
drewtato
10/2/2023
@Chowlett 当你调用一个函数时,该参数会自动重新借用。如果你把它扩展出去,它看起来像.所以真的,每次你打电话时都会发出一个新的临时,而不是被消耗掉。&mut
Iterator::take(&mut *my_ref, 4)
my_ref
&mut
take
0赞
Chowlett
10/2/2023
啊,太好了。我可以在文档中找到什么地方吗?
0赞
drewtato
10/3/2023
@Chowlett显然不是
评论