【发布时间】:2021-12-19 05:17:49
【问题描述】:
我先给代码
fn dump(iter: &mut dyn Iterator<Item=String>) {
for (i, v) in iter.enumerate() {
println!("{} {}", i, v);
}
for v in iter {
println!("{}", v);
}
}
#[test]
fn test_trait() {
let v = vec!["a".to_string(), "b".to_string(), "c".to_string()];
let mut iter = v.into_iter();
dump(&mut iter);
}
这是我运行此测试时的输出
运行 1 次测试
0 a
1 b
2 c测试 test_trait ... 好的
为什么调用 enumerate 时 iter 没有移动?
enumerate 接受 self 作为它的第一个参数,所以我认为它应该移动 iter, 但事实并非如此!第二个for循环仍然可以运行,没有任何编译错误。
【问题讨论】:
-
让我理清思路。
&mut dyn Iterator<Item=String>以某种方式实现了Iterator<Item=String>特征,所以iter可以调用enumerate函数,并且因为Self是&mut,所以iter不会根据上面提到的答案移动。而且&mut dyn Iterator<Item=String>实现了IntoIterator,所以iter.into_iter()在第二个for 循环中被调用。这次Self也是&mut(我猜),为什么感动? -
这里是 explanation 为什么 iter 会被 for 循环移动。由于引用post中解释的重新借用,它不会被枚举移动。
标签: rust iterator move ownership trait-objects