我在服务器端使用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() {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
究竟什么“价值”?为什么会出现错误?
如何解决?
答案 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::<...>
来解析输出类型。