0

下面的代码可以编译,但如果传递给函数 '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>`
4

1 回答 1

0

原因是因为在其项目上返回一个迭代器Vec::into_iter,而在对其项目slice::into_iter的引用上返回一个迭代器。所以,args.into_iter()是一个Iterator<Item=&String>而不是Iterator<Item=String>什么时候args是一个切片。附带说明一下,不要Box使用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());
}
于 2020-06-18T14:52:21.100 回答