微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

无法通过在引用上链接迭代器来构造Vec

如何解决无法通过在引用上链接迭代器来构造Vec

为什么此代码编译:

pub fn main() {
    let my_vec = vec!["b","c","d"];

    let res = ["a"].iter()
        .chain(my_vec.iter().map(|s| s))
        .collect::<Vec<_>>();

    println!("{:?}",res)
}

这不是:

pub fn main() {
    let my_vec = vec![(1,"b"),(2,"c"),(3,"d")];

    let res = ["a"].iter()
        .chain(my_vec.iter().map(|s| s.1))
        .collect::<Vec<_>>();

    println!("{:?}",res)
}

有没有办法使其编译?

背景

我正在尝试通过向其添加元素来重构构建矢量的代码。看起来像这样:

pub fn main() {
    let my_vec = vec![(1,"d")];

    let mut res = Vec::new();
    res.push("a");
    for (_,s) in &my_vec {
        res.push(s);
    }

    println!("{:?}",res)
}

我将其更改为可以从迭代器链中收集此向量的东西,而无需修改适当的可变实例:

pub fn main() {
    let my_vec = vec![(1,res)
}

我想到的构造无法编译:

error[E0271]: type mismatch resolving `<[closure@iter.rs:5:34: 5:41] as std::ops::FnOnce<(&({integer},&str),)>>::Output == &&str`
 --> iter.rs:5:10
  |
5 |         .chain(my_vec.iter().map(|s| s.1))
  |          ^^^^^ expected `str`,found `&str`
  |
  = note: expected reference `&str`
             found reference `&&str`
  = note: required because of the requirements on the impl of `std::iter::Iterator` for `std::iter::Map<std::slice::Iter<'_,({integer},&str)>,[closure@iter.rs:5:34: 5:41]>`

error[E0599]: no method named `collect` found for struct `std::iter::Chain<std::slice::Iter<'_,&str>,std::iter::Map<std::slice::Iter<'_,[closure@iter.rs:5:34: 5:41]>>` in the current scope
   --> iter.rs:6:10
    |
6   |           .collect::<Vec<_>>();
    |            ^^^^^^^ method not found in `std::iter::Chain<std::slice::Iter<'_,[closure@iter.rs:5:34: 5:41]>>`
    |
    = note: the method `collect` exists but the following trait bounds were not satisfied:
            `<std::iter::Map<std::slice::Iter<'_,[closure@iter.rs:5:34: 5:41]> as std::iter::Iterator>::Item = &&str`
            which is required by `std::iter::Chain<std::slice::Iter<'_,[closure@iter.rs:5:34: 5:41]>>: std::iter::Iterator`
            `std::iter::Chain<std::slice::Iter<'_,[closure@iter.rs:5:34: 5:41]>>: std::iter::Iterator`
            which is required by `&mut std::iter::Chain<std::slice::Iter<'_,[closure@iter.rs:5:34: 5:41]>>: std::iter::Iterator`

我尝试到处添加删除&标志,但没有任何帮助。我还尝试了一个更简单的变体:

pub fn main() {
    let my_vec = vec!["b",res)
}

这对我来说似乎并没有什么不同,但是编译器对此没有任何问题。

在我最初的问题中,结果不是Vec<&str>而是Vec<&T>,其中T是其他结构,但是我简化了示例,错误消息非常多相同。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。