使用迭代器时无法修复“此值的类型必须已知....”

时间:2018-03-07 01:51:25

标签: rust

我在服务器端使用Hyper:

    //"req" is hyper::server::Request
    match req.headers().iter().collect().filter(|x| x.name() == "field123").first() {
      Some(...) => ...........
    }

错误:

    error[E0619]: the type of this value must be known in this context
   --> src/main.rs:123:31
    |
123 |                         match req.headers().iter().collect().filter(|x| x.name() == "field123").first() {
    |                               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

究竟什么“价值”?为什么会出现错误?

如何解决?

1 个答案:

答案 0 :(得分:1)

编译器无法推断出您想要的集合类型。

https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.collect

  

因为collect()非常普遍,所以它可能会导致类型推断出现问题。因此,collect()是少数几次您会看到被亲切地称为“turofofish&#39::::<>”的语法之一。这有助于推理算法明确了解您尝试收集的集合。

考虑:

let input = [1, 2, 3, 4, 5, 6, 7, 8, 9];
let output = input.iter().map(|&x| x).collect();
println!("{:?}", output);

3 | let output = input.iter().map(|&x| x).collect();
  |     ^^^^^^
  |     |
  |     cannot infer type for `_`
  |     consider giving `output` a type

VS

let input = [1, 2, 3, 4, 5, 6, 7, 8, 9];
let output = input.iter().map(|&x| x).collect::<Vec<i32>>();
println!("{:?}", output);

[1, 2, 3, 4, 5, 6, 7, 8, 9]

你可能想要这些内容,虽然我不确定是什么,基于你的小片段:

let input = [1, 2, 3, 4, 5, 6, 7, 8, 9];
let output = input.iter().filter(|&x| *x > 5).nth(0);
println!("{:?}", output);

否则,明确使用collect::<...>来解析输出类型。