为什么我可以从 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());
}