0

Ich fange gerade an, Rust zu lernen und durch das Rust-Buch zu arbeiten. Eines der Kapitel führt durch einige Beispiele und endet mit einem "Versuch, diese generische Art von vorgeschlagenen Übungen zu machen". Ich habe mir dabei total den Kopf zerbrochen. Die halbgenerischer Typ mit denen Sie beginnen, ist dies: „Wert“Zurückkehrender Verweis auf generischen Typ mit generischem Fn-Merkmal/Wert

struct Cacher<T> 
    where T: Fn(i32) -> i32 
{ 
    value: Option<i32>, 
    // leaving out rest for brevity 

Dann habe ich so die Umwandlung dieser zu arbeiten, dass die Fn Charakterzug auch generisch ist, die auch die direkte Auswirkungen auf Also hier ist, was ich dachte:

struct Cacher<T, U> 
    where T: Fn(U) -> U 
{ 
    calculation: T, 
    value: Option<U>, 
} 

impl<T, U> Cacher<T, U> 
    where T: Fn(U) -> U 
{ 
    fn new(calculation: T) -> Cacher<T, U> { 
     Cacher { 
      calculation, 
      value: Option::None, 
     } 
    } 

    fn value(&mut self, arg: U) -> &U { 
     match self.value { 
      Some(ref v) => v, 
      None => { 
       let v = (self.calculation)(arg); 
       self.value = Some(v); 
       // problem is returning reference to value that was in 
       // v which is now moved, and unwrap doesn't seem to work... 
      }, 
     } 
    } 
} 

Alle meine Probleme sind in der Fn-Wert Getter. Ich bin mir nicht sicher, ob ich bin oder schließe oder ich ging einfach den völlig falschen Weg runter. Also, wo gehe ich von den Schienen?

Antwort

1

und unwrap scheint nicht zu funktionieren ...

Das Problem ist, dass unwrap Argument von Wert es dauert, so wird sie bewegt.

Etwas wie self.value.as_ref().unwrap() sollte den Trick tun.

+0

Ah, das ist es! Irgendwo in den Tutorials verpasste ich, dass das Auspacken ein * Move * war. Vielen Dank! – Chris

Verwandte Themen