我編寫了下面的Rust程序來打印出只有整數的命令行參數。它完美的作品:Rust函數的返回類型中的關閉
use std::env;
fn main() {
for i in env::args().filter_map(|arg| arg.parse::<i32>().ok()) {
println!("{}", i);
}
}
然後,我試圖重新編寫程序將過濾器抽象爲函數。這個版本不能編譯。
use std::env::Args;
use std::env;
use std::iter::FilterMap;
// Version 2
fn main() {
for i in nums(&env::args()) {
println!("{}", i);
}
}
fn nums<F: Fn(String) -> Option<i32>>(args: &Args) -> FilterMap<Args,F> {
args.filter_map(|arg| arg.parse::<i32>().ok())
}
它產生以下編譯錯誤:
Compiling iterator_return_type v0.1.0 (file:///Users/gabriel/AllProjects/SentimentAnalysis/iterator_return_type)
error[E0282]: type annotations needed
--> src/main.rs:16:9
|
16 | for i in nums(&env::args()) {
| ^cannot infer type for `_`
error: the type of this value must be known in this context
--> src/main.rs:22:27
|
22 | args.filter_map(|arg| arg.parse::<i32>().ok())
| ^^^^^^^^^^^^^^^^^^
error[E0308]: mismatched types
--> src/main.rs:22:21
|
22 | args.filter_map(|arg| arg.parse::<i32>().ok())
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected type parameter, found closure
|
= note: expected type `F`
found type `[[email protected]/main.rs:22:21: 22:50]`
error: aborting due to previous error(s)
error: Could not compile `iterator_return_type`.
我覺得特別困惑什麼是最終的編譯錯誤。我不明白我還可以指定一個閉包類型。
謝謝!
該問題給出的解決方案不適用於我的示例。在那個問題中,Split迭代器是返回類型。 FilterMap迭代器需要一個閉包類型參數。這是一個完全不同的問題。 –
您應該認真考慮重命名問題的標題,因爲它強烈建議重複上述建議。你似乎有更多的「不能引用封閉類型」的問題。 –
好的建議,謝謝!我已經這樣做了。 –