2017-09-29 1 views
3

Ich möchte eine Liste von einem beliebigen numerischen Typ in eine Liste von Schwimmern umwandeln. Der folgende Code nicht kompilieren:Von Merkmal funktioniert nur auf Werte, aber ich habe Referenzen

#[cfg(test)] 
mod tests { 
    #[test] 
    fn test_int_to_float() { 
     use super::int_to_float; 
     assert_eq!(vec![0.0, 1.0, 2.0], int_to_float(&[0, 1, 2])); 
    } 
} 

pub fn int_to_float<I>(xs: I) -> Vec<f64> 
where 
    I: IntoIterator, 
    f64: From<I::Item>, 
{ 
    xs.into_iter().map(f64::from).collect() 
} 

Die Fehlermeldung ist

error[E0277]: the trait bound `f64: std::convert::From<&{integer}>` is not satisfied 
--> src/main.rs:6:41 
    | 
6 |   assert_eq!(vec![0.0, 1.0, 2.0], int_to_float(&[0, 1, 2])); 
    |           ^^^^^^^^^^^^ the trait `std::convert::From<&{integer}>` is not implemented for `f64` 
    | 
    = help: the following implementations were found: 
      <f64 as std::convert::From<i8>> 
      <f64 as std::convert::From<i16>> 
      <f64 as std::convert::From<f32>> 
      <f64 as std::convert::From<u16>> 
      and 3 others 
    = note: required by `int_to_float` 

Ich verstehe, dass I::Item ist ein Verweis auf ein i32 (&i32), aber f64::from ist nur für Werte umgesetzt. Wie bekomme ich das kompilieren?

+2

Wir haben eine * Menge erhalten * von schlecht formatiert ist, übermäßig große Beiträge mit Fragen schwer zu folgen. Ich würde gerne erkennen, dass diese Frage keine von denen war und große Anstrengung zeigt! – Shepmaster

Antwort

1

Da Sie alles akzeptieren, was in einen Iterator umgewandelt werden kann, können Sie jedes Element im Iterator in das dereferenzierte Formular konvertieren. Die einfachste, was hier zu tun ist, Iterator::cloned zu verwenden:

assert_eq!(vec![0.0, 1.0, 2.0], int_to_float([0, 1, 2].iter().cloned())); 
Verwandte Themen