为什么我可以从 Vec 而不是从数组创建盒装迭代器?
Why can I create boxed iterator from Vec and not from array?
下面的代码可以编译,但是如果传递给函数 'f' 的 'args' 从 Vec 更改为字符串数组,则不会。我试图理解为什么。我认为它与所有权规则有关,但我可以澄清一下。谢谢
fn f(args: Box<dyn Iterator<Item=String>>) {
for arg in args {
println!("{}", arg)
}
}
fn main() {
let args = vec!["one_arg".to_string()]; // If changed to array, I get error below
f(Box::new(args.into_iter()));
}
如果vec!["one_arg".to_string()];改为:["one_arg".to_string()];,下面的错误就是结果。
error[E0271]: type mismatch resolving `<std::slice::Iter<'_, std::string::String> as std::iter::Iterator>::Item == std::string::String`
--> src/main.rs:10:7
|
10 | f(Box::new(args.into_iter()));
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ expected struct `std::string::String`, found reference
|
= note: expected struct `std::string::String`
found reference `&std::string::String`
= note: required for the cast to the object type `dyn std::iter::Iterator<Item = std::string::String>`
原因是因为 Vec::into_iter
returns 是对其项目的迭代器,而 slice::into_iter
returns 是对其项目的引用的迭代器。因此,当 args
是切片时,args.into_iter()
是 Iterator<Item=&String>
而不是 Iterator<Item=String>
。在旁注中,不要 Box
a dyn Iterator
而是使用通用的:
fn f<I: Iterator<Item=String>>(args: I) {
for arg in args {
println!("{}", arg)
}
}
fn main() {
let args = vec!["one_arg".to_string()];
f(args.into_iter());
}
下面的代码可以编译,但是如果传递给函数 'f' 的 'args' 从 Vec 更改为字符串数组,则不会。我试图理解为什么。我认为它与所有权规则有关,但我可以澄清一下。谢谢
fn f(args: Box<dyn Iterator<Item=String>>) {
for arg in args {
println!("{}", arg)
}
}
fn main() {
let args = vec!["one_arg".to_string()]; // If changed to array, I get error below
f(Box::new(args.into_iter()));
}
如果vec!["one_arg".to_string()];改为:["one_arg".to_string()];,下面的错误就是结果。
error[E0271]: type mismatch resolving `<std::slice::Iter<'_, std::string::String> as std::iter::Iterator>::Item == std::string::String`
--> src/main.rs:10:7
|
10 | f(Box::new(args.into_iter()));
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ expected struct `std::string::String`, found reference
|
= note: expected struct `std::string::String`
found reference `&std::string::String`
= note: required for the cast to the object type `dyn std::iter::Iterator<Item = std::string::String>`
原因是因为 Vec::into_iter
returns 是对其项目的迭代器,而 slice::into_iter
returns 是对其项目的引用的迭代器。因此,当 args
是切片时,args.into_iter()
是 Iterator<Item=&String>
而不是 Iterator<Item=String>
。在旁注中,不要 Box
a dyn Iterator
而是使用通用的:
fn f<I: Iterator<Item=String>>(args: I) {
for arg in args {
println!("{}", arg)
}
}
fn main() {
let args = vec!["one_arg".to_string()];
f(args.into_iter());
}