2017-09-05 38 views
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` 

這些函數返回一個u32u64作爲,但(他們是項目歐拉的問題),但我想如果可能的話,在所有類型中共同分享這個特徵,這個概念就會泛化。

+0

您沒有向我們展示任何'prob_X'函數的類型簽名,因此無法重現您的問題或回答此問題。 – loganfsmyth

+0

@loganfsmyth prob_1是u32 - > u32,prob_3是u64 - > u64。定時器函數的類型適用於各種各樣的問題調用關閉的個別調用,它是我現在似乎掛起的關閉和類型檢查器的集合。 – wegry

回答

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) 
    ]; 

現在這個錯誤發生是因爲你的函數返回一個具體類型(即u32u64)。這些不是隱含地轉換爲T,您必須手動執行此操作。我建議查找From特徵並實施,以便您可以進行轉換。否則,到處使用具體類型。

相關問題