0
與Iterate over vector of functions非常相似,我想遍歷一個函數vec。不同之處在於,我想調用每個函數並返回具有std::fmt::Display
特徵的對象。迭代一個返回共享相同特徵的對象的函數向量
use std::time::Instant;
use std::fmt;
fn timer<T: fmt::Display> (msg: &str, x: &Fn() -> T) -> T {
let now = Instant::now();
let val = x();
println!("({}) took {} ms\n\tResult: {}",
msg,
now.elapsed().subsec_nanos()/1000,
val
);
val
}
fn run_all<T: fmt::Display>() {
let problems: Vec<&Fn() -> T> = vec![
&|| prob_1(1000),
&|| prob_2(4_000_000),
&|| prob_3(600_851_475_143),
&|| prob_4(3),
&|| prob_5(20),
&|| prob_6(100),
&|| prob_7(10_000)
];
for (i, func) in problems.iter().enumerate() {
let problem_num: &str = ((i as u64) + 55).to_string().as_str();
timer(i, &func);
}
}
其中七個編譯器錯誤的手搖貌似
error[E0308]: mismatched types
--> euler.rs:17:13
|
17 | &|| prob_1(1000),
| ^^^^^^^^^^^^ expected type parameter, found u32
|
= note: expected type `T`
found type `u32`
這些函數返回一個u32
或u64
作爲,但(他們是項目歐拉的問題),但我想如果可能的話,在所有類型中共同分享這個特徵,這個概念就會泛化。
您沒有向我們展示任何'prob_X'函數的類型簽名,因此無法重現您的問題或回答此問題。 – loganfsmyth
@loganfsmyth prob_1是u32 - > u32,prob_3是u64 - > u64。定時器函數的類型適用於各種各樣的問題調用關閉的個別調用,它是我現在似乎掛起的關閉和類型檢查器的集合。 – wegry