【发布时间】:2016-12-08 21:39:35
【问题描述】:
为什么在闭包上没有类型注释的情况下编译?
fn transform(input: &Vec<Vec<String>>) {
input.iter().flat_map(|words| words.iter());
}
但这不是吗?
fn transform(input: &Vec<Vec<String>>) {
input.iter().flat_map(|words: &Vec<String>| words.iter());
}
推断的类型不是&Vec<String>吗?还是我也需要注释生命周期,因为这似乎是关于闭包的生命周期不够长?
后面的sn-p中的错误是
error[E0495]: cannot infer an appropriate lifetime for lifetime parameter in function call due to conflicting requirements
--> src/main.rs:2:55
|
2 | input.iter().flat_map(|words: &Vec<String>| words.iter());
| ^^^^
|
note: first, the lifetime cannot outlive the anonymous lifetime #1 defined on the block at 2:48...
--> src/main.rs:2:49
|
2 | input.iter().flat_map(|words: &Vec<String>| words.iter());
| ^^^^^^^^^^^^
note: ...so that reference does not outlive borrowed content
--> src/main.rs:2:49
|
2 | input.iter().flat_map(|words: &Vec<String>| words.iter());
| ^^^^^
note: but, the lifetime must be valid for the method call at 2:4...
--> src/main.rs:2:5
|
2 | input.iter().flat_map(|words: &Vec<String>| words.iter());
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
note: ...so type `fn(std::slice::Iter<'_, std::vec::Vec<std::string::String>>, [closure@src/main.rs:2:27: 2:61]) -> std::iter::FlatMap<std::slice::Iter<'_, std::vec::Vec<std::string::String>>, std::slice::Iter<'_, std::string::String>, [closure@src/main.rs:2:27: 2:61]> {<std::slice::Iter<'_, std::vec::Vec<std::string::String>> as std::iter::Iterator>::flat_map::<std::slice::Iter<'_, std::string::String>, [closure@src/main.rs:2:27: 2:61]>}` of expression is valid during the expression
--> src/main.rs:2:5
|
2 | input.iter().flat_map(|words: &Vec<String>| words.iter());
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
【问题讨论】:
-
@Shepmaster 谢谢,非常正确。这是其他东西的精简版,我没有清理它。参数原来是
&BTreeMap
标签: rust