与Iterate over vector of functions非常相似,我想迭代一系列函数。不同的是,我想调用每个函数并返回一个具有特征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
(它们是Project Euler问题),但是我希望,如果可能的话,将这种函数推广到共享特征的所有类型
答案 0 :(得分:1)
首先,您将使用当前设置获得生命周期错误,因此我们切换到使用除了立即超出范围的闭包之外的其他内容...
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)
];
现在发生此错误是因为您的函数返回了具体类型(即u32
或u64
)。这些不会隐式转换为T
,您必须手动执行此操作。我建议查找From
特征并实现它,以便您可以进行转换。否则,到处使用具体类型。